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