Не могу обновить JTextArea Swing

Я знаю, что есть много вопросов с одинаковым названием, я их все прочитал, но ни одно из их решений не помогло мне. Моя проблема в том, что сначала 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, я вызываю указанную выше функцию. Надеюсь ты сможешь мне помочь

Вы проверили, действительно ли щелчок по элементу JList переходит к слушателю с каким-то println

Krishnanshu Gupta 31.03.2018 01:44

Чтобы быстрее помочь, отправьте минимальный воспроизводимый пример или Краткий, автономный, правильный пример.

Andrew Thompson 31.03.2018 01:51

да, я отладил его и поставил точку останова в строке внутри if и он входит, так что код обязательно выполняется!

victor26567 31.03.2018 02:01

и да, это входит в слушателя, который у меня есть

victor26567 31.03.2018 02:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
38
1

Ответы 1

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, появляется текст, Надежды могут помочь решить эту проблему

victor26567 31.03.2018 11:41

решить эту проблему, JPanel было создано несколько типов, я поставил условие if, и оно работает, я не понимаю на 100%, почему, но это сработало

victor26567 31.03.2018 12:46

Другие вопросы по теме