Swing - 在另一帧中修改JList中的元素后更新它

时间:2016-12-29 17:26:31

标签: java swing

我有以下代码

DefaultListModel<String> modelPacientes = new DefaultListModel<>();
JList <String> listPacientes = new JList<>( modelPacientes );
listPacientes.setToolTipText("Lista de los pacientes del doctor");
GridBagConstraints gbc_listPacientes = new GridBagConstraints();
gbc_listPacientes.fill = GridBagConstraints.BOTH;
gbc_listPacientes.gridx = 0;
gbc_listPacientes.gridy = 0;
pPacientes.add(listPacientes, gbc_listPacientes);
modelPacientes.addElement(raul.getName() + " " + raul.getSurname());
modelPacientes.addElement(paula.getName() + " " + paula.getSurname());
modelPacientes.addElement(sara.getName() + " " + sara.getSurname());

我正在修改另一帧中对象(raul,paula和sara)的值,如何在关闭另一帧后在JList或其他任何地方(JLabel)更新它?

3 个答案:

答案 0 :(得分:2)

您可以提供自己的ListModel(或DefaultListModel)子类,它在方法patient.getName() + " " + patient.getSurname())中返回getElementAt

或者您可以将modelPacientes的创建移动到新方法:

ListModel createModel() {
  DefaultListModel<String> modelPacientes = new DefaultListModel<>();
  modelPacientes.addElement(raul.getName() + " " + raul.getSurname());
  modelPacientes.addElement(paula.getName() + " " + paula.getSurname());
  modelPacientes.addElement(sara.getName() + " " + sara.getSurname());
  return modelPacientes;
}

然后构建一个空的JList,并在pacientes发生变化时运行listPacientes.setModel(createModel())

如果您有几十名患者,这种方法很好。 如果您有数百或数千名患者,您可能需要拥有自己的模型类,从您的患者数据映射到Swing组件需要的任何内容。

答案 1 :(得分:2)

  

我正在修改对象的值

然后ListModel应该包含Objects而不是String。因此,假设您的对象类型为User,您可以执行以下操作:

DefaultListModel<User> modelPacientes = new DefaultListModel<User>();
JList<User> listPacientes = new JList<User>( modelPacientes );

modelPacientes.addElement(raul);
modelPacientes.addElement(paula);
modelPacientes.addElement(sara);

然后在User类中,您可以覆盖toString()方法以返回要在JList中显示的值:

@Override
public String toString()
{
    return getName() + " " + getSurname();
}
  

我正在修改另一个框架中的对象(r​​aul,paula和sara)的值

然后从User获取要修改的ListModel对象,并将此对象传递给JDialog(注意,您应该使用JDialog,而不是弹出子窗口的JFrame)。

然后更新User对象中的数据,当对话框关闭时,您在repaint()上调用JList

答案 2 :(得分:0)

将对象(raulpaulasara)添加到列表模式中。然后创建一个ListCellRenderer,它将返回一个字符串,即“显示名称”,例如:

raul.getName() + " " + raul.getSurname()

这样,当raulpaula和/或sara的名称发生更改时,如果它与对象的实例相同,则会在列表中自动更改。