Java 无法刷新JTextArea Swing

Java 无法刷新JTextArea Swing,java,swing,jtextarea,Java,Swing,Jtextarea,我知道有很多问题都有相同的标题,我都读了,但是他们的解决方案都不适合我。我的问题是,起初JTextArea必须是空的,但当我单击JList元素时,它必须显示气象预测。但是当我用他的监听器在JList上单击该元素时,JTextArea不会更新,它保持为空。这是我的代码: public void textoInfoMunicipio (){ //JTextArea area = new JTextArea(30,50); area.setEditable(false);

我知道有很多问题都有相同的标题,我都读了,但是他们的解决方案都不适合我。我的问题是,起初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);


}
public void textoInfoMunicipio(){
//JTextArea=新的JTextArea(30,50);
区域设置可编辑(假);
JPanel content=新的JPanel();
setLayout(新的BorderLayout());
添加(区域、边框布局、中心);
content.setboorder(BorderFactory.createLineBorder(Color.black));//con esto le ponemos un borde negro en los margenes del JPANEL
content.setboorder(BorderFactory.createTitledBorder(“Predicciones”);
IPrediccionService ps=新的AEMETPrediccionService();
清单a;
试一试{
如果(arranque_app==false和&municipio_seleccionado!=null){//si la apliccion ya ha arrancado,则在预测信息中最常见
字符串头=“”
+“******************************************************************************************************************\n”
+“Predicción para el municipio de”+市政当局选择。getNombre()+“\n”
+“******************************************************************************************************************\n”
+“临时mín/máx\t Estado del cielo\n”;
lista=ps.getprediccionesbydmunicipio(市政当局_seleccionado.getCodMunicipio());//说明,这是一家小型服务公司
字符串predicciones=“”;
//雷科里多酒店
对于(IPrediccion p:lista)
predicciones+=p.getFecha()+“\t”+p.getTemperaturaMinima()+“/”+p.getTemperaturaMaxima()+“\t\t”+p.getEstadoCielo()+“\n”;
area.setText(header+predicciones);//functiona,seve bien
//content.revalidate();
//content.repaint();
//更新(area.getGraphics());
}
}捕获(异常e){//PrediccionService异常e
e、 printStackTrace();
}
gbc.gridx=1;
gbc.gridy=0;
gbc.gridwidth=3;
gbc.gridheight=8;
gbc.weightx=1.0;
gbc.weighty=1.0;
小组负责人添加(内容,gbc);
}
在listener事件中,我的意思是,当选择JList中的一个元素时,我调用上面的函数。希望你能帮助我

当选择JList中的一个元素时,我调用上面的函数

你的代码毫无意义。您可以创建一个新的JPanel,但不能创建一个JTextArea。然后将文本区域添加到面板中。组件只能有一个父级,因此文本区域将从第一个面板中删除。另外,文本区域通常会添加到JScrollPane中,然后将滚动窗格添加到面板中

gbc.gridx = 1;
我觉得你对GridBagLayout的使用不正确

1) 不确定gridwidth/height是否符合您的想法。您只能向面板中添加一个组件,因此不能随意使用3/8的值,除非您在代码的其他部分中添加了其他组件

2) 每次添加面板时,都使用“1”的gridx。所有面板将放在同一个单元中。这可能是你的问题。添加的最后一个构件将首先绘制。所以,您可以在刚才添加的面板顶部绘制其他面板

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

你是否检查了点击JList项是否真的进入了一个监听器,并带有某种println为了更快地获得更好的帮助,发布了一个or。是的,我调试了它,并在if和它进入的行中放置了一个断点,这样代码肯定会执行!是的,听众会觉得我非常感谢你的回答。一步一步。JTextArea在代码的另一个parr中被实例化,其次,关于网格包,是的,我的意思是,我的程序总体上是由几个JPanel组成的,这些JPanel里面有组件,组件的位置是确定的。我刚才测试的是,如果我把“content.add(area,BorderLayout.CENTER);“over of the line”面板的主体添加(content,gbc);“发生的是,文本不会出现,但是如果我用鼠标拖动JTextArea所在的空间,文本就会出现,希望能帮助解决这个问题,JPanel安装了几种类型,我设置了一个if条件,它工作了,我不理解100%为什么,但它工作了