【问题标题】:Saving Data on a new JTable (new JFrame) using NetBeans GUI builder使用 NetBeans GUI 构建器将数据保存在新 JTable(新 JFrame)上
【发布时间】:2015-07-03 14:50:30
【问题描述】:

我对 java 很陌生,这就是我使用 NetBeans GUI builder 的原因,基本上我创建了一个具有两个组件的 JFrame,我能够保存两个文本字段的数据并使用提交按钮将其放入 JFrame 中的 JTable 中。但是我专门创建了一个新的 JFrame 来保存 JTable。所以一个 JFrame 有两个文本字段和一个提交按钮,另一个 JFrame 作为 JTable。下面是我在一个 JFrame 中拥有 JTable、按钮和两个文本字段时使用的代码。我将如何尝试将数据保存到仅包含 JTable 的不同 JFrame 中?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
   DefaultTableModel model = (DefaultTableModel) table.getModel();
   model.addRow(new Object[]{/*some stuff here ignore for this question*/});
}

【问题讨论】:

  • 要么使这些标签静态或表格静态..然后简单地得到类似frame1.textfield1.getText()
  • 1) 请参阅The Use of Multiple JFrames, Good/Bad Practice? 2) 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。 3) @Madhan 建议的 static 不是解决此问题的正确方法。 制作 static 以便其他类可以访问它们会回来困扰你。

标签: java swing user-interface netbeans


【解决方案1】:

使用来自 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);
            }
        });
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2013-05-02
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多