使用来自 Frame1 的文本字段的值更新来自 Frame2 的表的一种方法是使用观察者模式。 Frame1 将有一个观察者列表,一旦可观察对象(Frame1)插入或具有新值,就需要更新这些观察者列表。我将添加代码以便能够更好地理解这一点。另外,看看观察者模式。
让我们定义一个 Observable 接口(这些都是 Observable 需要实现的方法)
public interface Observable {
public void addObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver(String[] row);
}
让我们定义 Frame1,它将成为 Observervable
public class Frame1 extends javax.swing.JFrame implements Observable{
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JButton submitButton;
private List<Observer> observers = new ArrayList<>();
public Frame1() {
initComponents(); // 2 text fields and 1 button
}
private void initComponents() {
// I will skip this part you can generate it with NetBeans
// Basically initialise jTextField1, jTextField2, and submitButton
}
private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
String[] row = {jTextField1.getText(), jTextField2.getText()};
notifyObserver(row);
}
@Override
public void addObserver(Observer o) {
observers.add(o); // subscribe new observer
}
@Override
public void removeObserver(Observer o) {
observers.remove(o); // unsubscribe new observer
}
@Override
public void notifyObserver(String[] row) {
for (Observer observer: observers) {
observer.update(row); // notify all observers that new row values are available
}
}
}
另外,我们定义一个 Observer 接口(这些都是 Observer 需要实现的方法)
public interface Observer {
public void update(String[] row);
}
让我们定义 Frame2,它将成为观察者
public class Frame2 extends javax.swing.JFrame implements Observer {
private javax.swing.JTable jTable1;
public Frame2() {
initComponents();
}
private void initComponents() {
// I will skip this part you can generate it with NetBeans
// Basically initialise jTable1
}
public void addRow(String column1, String column2){
DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
model.addRow(new Object[]{column1, column2});
}
@Override
public void update(String[] row) {
addRow(row[0], row[1]);
}
}
现在,让我们打包所有内容并进行测试:
public class Main {
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Frame2 frame2 = new Frame2();
Frame1 frame1 = new Frame1();
// Register frame2 as an observer of frame1
frame1.addObserver(frame2);
frame1.setVisible(true);
frame2.setVisible(true);
}
});
}
}