Согласно комментариям, один из способов разрешить внешним классам видоизменять класс - дать классу открытый метод, который могут вызывать внешние классы, а затем передать экземпляр ключевого экземпляра этого класса туда, где это необходимо.Например, рассмотрите возможность изменения
private void addPerson (Person p){
personDefaultListModel.addElement(p);
}
на public.
public void addPerson (Person p){
personDefaultListModel.addElement(p);
}
Если вам нужно изменить полную модель списка, то предоставьте этому классу открытый метод, который позволяет вам сделать это:
public void setListModel (DefaultListModel<Person> model){
personJList.setModel(model);
}
Другие проблемы с вашим кодом:
- цикл
while (true)
, вызываемый в потоке событий Swing, заморозит ваше приложение и поэтому не будет здесь.
Например, если вы хотите запустить диалоговое окно, которое позволяет другому классу добавить Person в основной JList GUI, вы можете сделать:
import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.Window;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class MainPersonGui extends JPanel {
private DefaultListModel<Person> personDefaultListModel = new DefaultListModel<>();
private JList<Person> personJList = new JList<>(personDefaultListModel);
private JDialog addPersonDialog;
public MainPersonGui() {
personJList.setVisibleRowCount(15);
personJList.setPrototypeCellValue(
new Person("xxxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxx"));
addPerson(new Person("Duck", "Donald"));
JButton addPersonBtn = new JButton(new AbstractAction("Add Person") {
@Override
public void actionPerformed(ActionEvent e) {
if (addPersonDialog == null) {
Window owner = SwingUtilities.getWindowAncestor(MainPersonGui.this);
addPersonDialog = new JDialog(owner, "Add Person", ModalityType.MODELESS);
addPersonDialog.add(new AddPersonPanel(MainPersonGui.this));
addPersonDialog.pack();
}
addPersonDialog.setVisible(true);
}
});
setLayout(new BorderLayout());
add(new JScrollPane(personJList));
add(addPersonBtn, BorderLayout.PAGE_END);
}
// !! make this public
public void addPerson(Person p) {
personDefaultListModel.addElement(p);
}
private static void createAndShowGui() {
MainPersonGui mainPanel = new MainPersonGui();
JFrame frame = new JFrame("Test GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
@SuppressWarnings("serial")
class AddPersonPanel extends JPanel {
private MainPersonGui personGui;
private JTextField firstNameField = new JTextField(10);
private JTextField lastNameField = new JTextField(10);
public AddPersonPanel(MainPersonGui personGui) {
this.personGui = personGui; // set the reference to main
add(new JLabel("First Name:"));
add(firstNameField);
add(Box.createHorizontalStrut(20));
add(new JLabel("Last Name:"));
add(lastNameField);
add(Box.createHorizontalStrut(20));
add(new JButton(new AbstractAction("Insert Name") {
@Override
public void actionPerformed(ActionEvent e) {
String name = firstNameField.getText();
String surname = lastNameField.getText();
Person person = new Person(name, surname);
// **** here call the main's addPerson() method ****
personGui.addPerson(person);
firstNameField.setText("");
lastNameField.setText("");
}
}));
}
}