【问题标题】:cant refresh a JTextArea Swing无法刷新 JTextArea Swing
【发布时间】:2018-03-30 23:23:56
【问题描述】:

我知道有很多同名的问题,我都阅读了它们,但没有一个对我有用。我的问题是,起初 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);


}

In the listener event, I mean, when an element in JList is selected, I call the function above.希望你能帮助我

【问题讨论】:

  • 您是否检查过单击 JList 项是否真的进入了侦听器,并带有某种 println
  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 是的,我调试了它,我在 if 和它进入的那行里面放了一个断点,这样代码就可以执行了!
  • 是的,它进入了我拥有的监听器

标签: java swing jtextarea


【解决方案1】:

当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

【讨论】:

  • 非常感谢您的回答。步骤 y 步骤。 JTextArea 是在另外一段代码中实例化的,其次,关于网格包,是的,我的意思是,我的程序整体是由几个 JPanel 复合而成的,里面有组件,组件的位置还可以。我刚刚测试的是,如果我输入“content.add(area,BorderLayout.CENTER);”行“panel_principal.add(content, gbc);”行上方发生的情况是,文本没有出现,但是如果我用鼠标拖动鼠标在 JTextArea 所在的空间上单击,就会出现文本,希望可以帮助解决它
  • 解决它,JPanel 被激活了几种类型,我设置了一个 if 条件并且它有效,我不明白 100% 为什么但它有效
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 2014-12-20
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多