Я знаю, что есть много вопросов с одинаковым названием, я их все прочитал, но ни одно из их решений не помогло мне. Моя проблема в том, что сначала JTextArea должна быть пустой, но когда я нажимаю элемент JList, он должен отобразить метеорологический прогноз. Но когда я щелкаю этот элемент в JList его слушателем, JTextArea не обновляется, он остается пустым. Это мой код:
public void textoInfoMunicipio (){
//JTextArea area = new JTextArea(30,50);
area.setEditable(false);
JPanel content = new JPanel();
content.setLayout(new BorderLayout());
content.add(area,BorderLayout.CENTER);
content.setBorder(BorderFactory.createLineBorder(Color.black)); //con esto le ponemos un borde negro en los margenes del JPANEL
content.setBorder(BorderFactory.createTitledBorder("Predicciones"));
IPrediccionService ps = new AEMETPrediccionService();
List<IPrediccion> lista;
try {
if (arranque_app == false && municipio_seleccionado != null){ // si la aplicacion ya ha arrancado, entonces podemos mostrar la info de las predicciones
String header = ""
+ "********************************************************************* \n"
+ "Predicción para el municipio de "+municipio_seleccionado.getNombre()+"\n"
+ "********************************************************************* \n"
+ "Fecha \t Temp.mín/máx \t Estado del cielo \n";
lista = ps.getPrediccionesByIdMunicipio(municipio_seleccionado.getCodMunicipio()); //DESCOMENTAR, ES PA AHORRAR PETICIONES AL SERVIDOR AEMET
String predicciones = "";
// Recorrido de la lista mostrando solamente las predicciones
for ( IPrediccion p : lista )
predicciones += p.getFecha()+"\t"+p.getTemperaturaMinima()+"/"+p.getTemperaturaMaxima()+"\t\t"+p.getEstadoCielo()+"\n";
area.setText(header+predicciones); //funciona, se ve bien
//content.revalidate();
//content.repaint();
//area.update(area.getGraphics());
}
} catch (Exception e) { //PrediccionServiceException e
e.printStackTrace();
}
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 3;
gbc.gridheight = 8;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
panel_principal.add(content, gbc);
}
В событии прослушивателя я имею в виду, что когда выбран элемент в JList, я вызываю указанную выше функцию. Надеюсь ты сможешь мне помочь
Чтобы быстрее помочь, отправьте минимальный воспроизводимый пример или Краткий, автономный, правильный пример.
да, я отладил его и поставил точку останова в строке внутри if и он входит, так что код обязательно выполняется!
и да, это входит в слушателя, который у меня есть




when an element in JList is selected, I call the function above
Что ж, ваш код не имеет смысла. Вы создаете новую панель JPanel, но не область JTextArea. Затем вы добавляете текстовую область на панель. Компонент может иметь только одного родителя, поэтому текстовая область будет удалена с первой панели. Также текстовая область обычно добавляется к JScrollPane, а затем вы добавляете область прокрутки на панель.
gbc.gridx = 1;
Ваше использование GridBagLayout кажется мне неправильным.
1) Не уверен, что ширина / высота сетки делают то, что вы думаете. Вы добавляете только один компонент на панель, поэтому вы не можете просто случайным образом использовать значения 3/8, если вы не добавили другие компоненты в другие части вашего кода.
2) Вы используете сетку «1» каждый раз, когда добавляете панель. Все панели войдут в одну ячейку. Это может быть твоя проблема. Последний добавленный компонент окрашивается первым. Итак, вы можете нарисовать другие панели поверх только что добавленной панели.
for ( IPrediccion p : lista )
predicciones += p.getFecha()+"\t"+p.getTemperaturaMinima()+"/"+p.getTemperaturaMaxima()+"\t\t"+p.getEstadoCielo()+"\n";
area.setText(header+predicciones);
Пишите читаемый код с правильным отступом. Укажите интервал между кодом для цикла и кодом вне цикла. Вышеупомянутое выглядит так, как будто у вас есть несколько строк кода в цикле.
В случае, если лучший способ добавить текст в текстовую область - использовать метод append(...), тогда у вас не будет всего этого кода в длинном операторе. Или используйте StringBuilder для создания текстовой строки.
Кроме того, поскольку вы используете вкладки, это означает, что вы пытаетесь расположить данные в столбцах. JTextArea - не лучший компонент для этого. Вместо этого вы должны использовать JTable.
Большое спасибо за ответ. Шаг y шаг. JTextArea создается в другом парсере кода. Во-вторых, о сетке, да, я имею в виду, что моя программа в целом состоит из нескольких JPanel, внутри которых есть компоненты, и места компонентов в порядке. Я только что протестировал, если я поставлю строку «content.add (area, BorderLayout.CENTER);» над строкой "panel_principal.add (content, gbc);" что происходит, так это то, что текст не появляется, но если я перетаскиваю щелчок мышью по пространству, где находится JTextArea, появляется текст, Надежды могут помочь решить эту проблему
решить эту проблему, JPanel было создано несколько типов, я поставил условие if, и оно работает, я не понимаю на 100%, почему, но это сработало
Вы проверили, действительно ли щелчок по элементу JList переходит к слушателю с каким-то println