无法刷新JTextArea Swing

时间:2018-03-30 23:23:56

标签: java swing jtextarea

我知道有很多问题都有相同的标题,我全都读了,但是没有一个解决方案对我有用。我的问题是,起初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中的元素时,我调用上面的函数。希望你能帮帮我

1 个答案:

答案 0 :(得分:0)

  

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

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

gbc.gridx = 1;

您对GridBagLayout的使用对我来说似乎不对。

1)不确定网格宽度/高度是否符合您的想法。您只需在面板中添加一个组件,这样您就不能随意使用3/8的值,除非您在代码的其他部分添加了其他组件。

2)你使用&#34; 1&#34;每次添加面板。所有面板都将放在同一个单元格中。这可能是你的问题。添加的最后一个组件首先绘制。因此,您可以在刚刚添加的面板顶部绘制其他面板。

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