【问题标题】:Refresh JFrame from JDialog button and refresh table从 JDialog 按钮刷新 JFrame 并刷新表
【发布时间】:2014-05-02 22:35:57
【问题描述】:

我开始开发一个适用于表格的应用程序。最初,JFrame 的表是空的。当我单击 JFrame 上的添加行按钮时,JDialog 窗口打开。在其中,我编写了所需的属性,当我单击保存时,它们应该保存在由 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

【问题讨论】:

  • 首先,你的变量和方法不是英文的。而且由于您不告诉我们什么是什么,我们甚至无法开始尝试加密它。其次,这到底是什么意思:“对象保存在表中表示的列表中”。你有一个JTable。如果有,请提及。

标签: java swing jframe jdialog


【解决方案1】:

这是你需要做的。

  • 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,并且可以从任何一个类中更新。

【讨论】:

  • 更好的主意,使用 getter(可能还有 setter)构建对话框,当它返回时,将更改应用于任何内容......您甚至可以使用 JOptionPane 而不是 JDialog
  • @MadProgrammer 很好奇,你为什么说这是一个更好的主意?
  • 因为您不会将表模型暴露给不需要的修改。对话的职责是收集信息并将其传递回调用者 - 恕我直言
【解决方案2】:

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

为此,您可以考虑将对话框制作成JPanel(不带按钮)并改用JOptionPane,而不是创建自定义JDialog...

// 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 获取值,然后将它们应用于表模型或简单地忽略更改...作为示例

【讨论】:

    【解决方案3】:

    这个皮肤有很多方法:

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

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 2013-05-06
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 2013-05-05
      • 2015-12-18
      相关资源
      最近更新 更多