从JDialog按钮和刷新表刷新JFrame

时间:2014-05-02 22:35:58

标签: java swing jframe jdialog

我开始开发一个与表一起使用的应用程序。最初,JFrame的表是空的。当我点击JFrame JDialog窗口上的添加行按钮打开时。在其中,我编写了所需的属性,当我单击save时,它们应该保存在JFrame上的表所代表的列表中,并在关闭JDialog时显示。这是不起作用的部分。我知道我的模型很好,其他所有东西都可以看到,因为当我点击一个按钮后我添加了一个实现JFrame刷新方法的按钮。请帮帮我。

JFrame类中的

方法:

public void fillTable() {


    ModelTabele mt = new ModelTabele(true, kontrolor.Kontrolor.vratiObjekatKontrolora().vratiAsistente());
    jTable1.setModel(mt);


} //applying model on Jframe

和JDialog类中的方法:

private void jbtSaveActionPerformed(java.awt.event.ActionEvent evt) {                                           

    Asistent a = new Asistent();
    a.setSifra(Integer.valueOf(jtfSifra.getText()));
    a.setIme(jtfIme.getText());
    a.setPrezime(jtfPrezime.getText());
    a.setTitula(jtfTitula.getText());
    a.setPredmet((Predmet) jcbPredmeti.getSelectedItem());
    kontrolor.Kontrolor.vratiObjekatKontrolora().dodajAsistenta(a);

    this.dispose();


} //after adding attributes, JDialog needs to be closed and object is saved in a list represented in table

3 个答案:

答案 0 :(得分:2)

这是您需要做的事情。

  • TableModel传递给对话框类。
  • 为此,您需要更改对话框的构造函数
  • 然后只需从对话框类中更新模型。
  • 类似的东西:(注意:既然你没有使用英语,我不知道你的变量和方法是什么,我会用自己的)

    class MyDialog extends JDialog {
        DefaultTableModel model;
    
        public MyDialog(JFrame frame, modal true, DefaultTableModel model) {
            super(frame, modal);
            this.model = model;
        }
    
        private void saveButtonActionPerformed(ActionEvent e) {
            ...
            model.addRow(...)
        }
    }
    
    class MyFrame extends JFrame {
        private JTable jTable1;
    
        private void showDialogActionPerformed(ActionEvent e) {
            DefaultTableModel model =  (DefaultTableModel)jTable1.getModel();
            MyDialog dialog = new MyDialog(this, true, model);
        }
    }
    

现在两个类都引用了相同的TableModel,并且可以从任何一个更新。

答案 1 :(得分:1)

退一步看看责任的错误。该对话框负责收集信息并通知调用用户选择的选项(保存,取消,什么),对话框不应该修改程序状态(恕我直言)。

为此,您可以考虑将对话框设置为JDialog(不使用按钮),而不是创建自定义JPanel,而是使用JOptionPane代替...

// editorPane is your panel that gathers the information
int option = JOptionPane.showOptionDialog(null, editorPane, 
                "Add",
                JOptionPane.NO_OPTION,
                JOptionPane.PLAIN_MESSAGE, 
                null,
                new Object[]{"Save", "Cancel"},
                "Save"
);
if (option == 0) {
    // Get the details from the editor pane...
    // Update model
}

基本上,您可以通过JOptionPane向用户显示编辑器窗格。当用户选择其中一个可用选项(在此示例中为savecancel)时,您将检查用户选择的内容并根据该结果获取editorPane中的值然后将它们应用于表模型或简单地忽略更改......作为示例

答案 2 :(得分:0)

有很多方法可以解决这个问题:

  1. 蛮力:正如@peeskillet建议的那样,你可以传递你梦寐以求的TableModel并让任何人更新它。这应该让你的代码工作,但它确实感觉不对。
  2. 将所有更新代码保留在JFrame课程中,并启动模式JOptionPane,以阻止处理,如@MadProgrammer所示。
  3. 通过实现(设计的)接口来抽象JFrame类的模型更新方法,并将JFrame类作为此接口的实例传递给JDialog类。在save方法中,您可以使用数据作为输入来调用接口API。