有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想创建一个包含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);
                    }


                } 

共 (2) 个答案

  1. # 1 楼答案

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

    艰难的道路

    public void actionPerfomed(ActionEvent e) {
    
        TableModel model = //... Create the new model based on you needs
        JTable table = new JTable(model);
    
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    
    }
    

    这将要求您在每个操作侦听器中复制此代码。。。这是很多代码

    稍微容易

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

    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);
    }
    

    这将集中显示和管理表和数据的核心逻辑

    好一点

    使用第二个选项,您可以使用ActionAPI生成基本操作,这些操作提供生成模型所需的信息,但允许基本操作类实际确定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
        }
    
    }
    

    查看How to use Actions了解更多信息

    结论

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

  2. # 2 楼答案

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

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

    这是一个example

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

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