在新窗口中创建JTable作为Java中JMenuItem的操作侦听器

在新窗口中创建JTable作为Java中JMenuItem的操作侦听器,java,swing,user-interface,jtable,Java,Swing,User Interface,Jtable,我想创建一个包含JTable的新窗口。由于按了JMenuItem,我尝试在动作侦听器内部创建一个新类,但不确定这是否正确。不管怎样,它不起作用,请建议 ... help.add(currencyTable); ... //action listener for the currency table JMenuItem button currencyTable.addActionListener(new ActionListener() {

我想创建一个包含
JTable
的新窗口。由于按了
JMenuItem
,我尝试在动作侦听器内部创建一个新类,但不确定这是否正确。不管怎样,它不起作用,请建议

...

help.add(currencyTable);
...

        //action listener for the currency table JMenuItem button

        currencyTable.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                class currencyJTableClass extends JFrame
                {
                    JTable currencyTable;

                    public currencyJTableClass()
                    {
                        setLayout(new FlowLayout());
                        String[] headLine = {"x","y","z"} ;
                        String [][] currencyData =
                                {
                                        {
                                          "a","b","c"
                                        },
                                        {
                                          "d","e","f"
                                        },
                                };
                        currencyJTable = new JTable(currencyData,headLine);
                    }


                } 

不要在
ActionListener
中创建
JFrame
JTable
。相反,在启动时使用
JTable
TableModel
创建一个
JFrame
。然后,在
ActionListener
中,使用希望显示的数据更新模型

开始学习如何使用表模型时,请从
DefaultTableModel
开始,因为它支持通过使用和对模型进行动态更改

这是一个

注意:如果您确实需要创建一个单独的窗口来显示数据,则有以下几种可能性:

  • 使用模态
    JDialog
    -将用户焦点吸引到窗口中的内容
  • 改用-允许轻松显示许多组件

不要在
ActionListener
中创建
JFrame
JTable
。相反,在启动时使用
JTable
TableModel
创建一个
JFrame
。然后,在
ActionListener
中,使用希望显示的数据更新模型

开始学习如何使用表模型时,请从
DefaultTableModel
开始,因为它支持通过使用和对模型进行动态更改

这是一个

注意:如果您确实需要创建一个单独的窗口来显示数据,则有以下几种可能性:

  • 使用模态
    JDialog
    -将用户焦点吸引到窗口中的内容
  • 改用-允许轻松显示许多组件

看来你似乎决心走这条路,你有很多选择

艰难的道路。。。 这将需要您在每个操作侦听器中复制此代码…这是大量的代码

稍微容易 自己创建一个简单的实现,将所有必需的逻辑包装成几个基本类

public class ModelPane extends JPanel {

    private JTable table;

    public ModelPane(TableModel model) {
        setLayout(new BorderLayout());
        table = new JTable(model);
        add(new JScrollPane(table));
    }

}

public class ModelFrame extends JFrame {

    public ModelFrame(TableModel model) {
        setLayout(new BorderLayout());
        add(new ModelPane(model));
        pack();
        setLocationRelativeTo(null);
    }

}
然后在你的
actionPerformed
方法中,你可以简单地做

public void actionPerfomed(ActionEvent e) {
    TableModel model = //... Create the new model based on you needs
    ModelFrame frame = new ModelFrame(model);
    frame.setVisible(true);
}
这将集中显示和管理表和数据的核心逻辑

好一点 使用第二个选项,您可以使用
Action
API生成基本操作,这些操作提供生成模型所需的信息,但允许基本操作类实际确定
actionPerformed
方法的工作方式

public abstract class AbstractModelAction extends AbstractAction {

    public abstract TableModel getModel();

    @Override
    public void actionPerformed(ActionEvent e) {
        ModelFrame frame = new ModelFrame(getModel());
        frame.setVisible(true);
    }
}

public class CurrencyModelAction extends AbstractModelAction {

    @Override
    public TableModel getModel() {
        return //... Create the new model based on you needs
    }

}
查看更多信息

结论
使用最灵活且提供最佳重用的方法。我很少创建自定义的
JFrame
s,因为我更喜欢创建面板,因为这意味着我可以在我想要的任何环境中重复使用它们,既灵活又可重用;)

看来你似乎决心走这条路,你有很多选择

艰难的道路。。。 这将需要您在每个操作侦听器中复制此代码…这是大量的代码

稍微容易 自己创建一个简单的实现,将所有必需的逻辑包装成几个基本类

public class ModelPane extends JPanel {

    private JTable table;

    public ModelPane(TableModel model) {
        setLayout(new BorderLayout());
        table = new JTable(model);
        add(new JScrollPane(table));
    }

}

public class ModelFrame extends JFrame {

    public ModelFrame(TableModel model) {
        setLayout(new BorderLayout());
        add(new ModelPane(model));
        pack();
        setLocationRelativeTo(null);
    }

}
然后在你的
actionPerformed
方法中,你可以简单地做

public void actionPerfomed(ActionEvent e) {
    TableModel model = //... Create the new model based on you needs
    ModelFrame frame = new ModelFrame(model);
    frame.setVisible(true);
}
这将集中显示和管理表和数据的核心逻辑

好一点 使用第二个选项,您可以使用
Action
API生成基本操作,这些操作提供生成模型所需的信息,但允许基本操作类实际确定
actionPerformed
方法的工作方式

public abstract class AbstractModelAction extends AbstractAction {

    public abstract TableModel getModel();

    @Override
    public void actionPerformed(ActionEvent e) {
        ModelFrame frame = new ModelFrame(getModel());
        frame.setVisible(true);
    }
}

public class CurrencyModelAction extends AbstractModelAction {

    @Override
    public TableModel getModel() {
        return //... Create the new model based on you needs
    }

}
查看更多信息

结论
使用最灵活且提供最佳重用的方法。我很少创建自定义的
JFrame
s,因为我更喜欢创建面板,因为这意味着我可以在我想要的任何环境中重复使用它们,既灵活又可重用;)

谢谢你的回答。为什么不在动作侦听器中创建一个新的分离的
JFrame
/
JTable
?这是一种不好的做法还是仅仅是错误的?请看,我现在无法更改我的整个GUI来实现
CardLayout
,并且
JDialog
将冻结主
JFrame
,这是不允许的,因为用户一直在与它交互。我现在明白了创建多个
JFrame
s是一种糟糕的做法,但我现在别无选择。更多的可能性?考虑张贴A。这可能属于一个新问题。“
JDialog
将冻结主
JFrame
”仅当它是模态的。“我现在不能改变我的整个GUI来实现
CardLayout
”修复一个糟糕的设计通常比解决当前设计的问题要快。谢谢你的回答。为什么不在动作侦听器中创建一个新的分离的
JFrame
/
JTable
?这是一种不好的做法还是仅仅是错误的?请看,我现在无法更改我的整个GUI来实现
CardLayout
,并且
JDialog
将冻结主
JFrame
,这是不允许的,因为用户一直在与它交互。我现在明白了创建多个
JFrame
s是一种糟糕的做法,但我现在别无选择。更多的可能性?考虑张贴A。这可能属于一个新问题。“
JDialog
将冻结主
JFrame
”仅当它是模态的。“我现在无法更改整个GUI来实现
CardLayout
”修复一个不好的设计通常比解决当前设计的问题要快。这取决于您是否希望打开多个窗口(即,当单击菜单项时,它应该处理任何现有的“子”窗口还是不关心)我有一个主
JFrame
窗口,其中有几个
JMenuItem
s。我想创建另一个
JFrame
窗口,其中包括