【问题标题】:Is this JPanel code good? Not showing the other JPanel when clicked on the button这个 JPanel 代码好吗?单击按钮时不显示其他 JPanel
【发布时间】:2016-02-18 01:08:47
【问题描述】:

当有人点击按钮时,如何让第二个 JPanel 显示出来? 该代码给出了一个错误 - 未知来源。我错过了什么?

package Com.global;

import java.awt.BorderLayout;

public class Govinda extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JPanel panel;
    private JPanel panel_1;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Govinda frame = new Govinda();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Govinda() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new CardLayout(0, 0));

        final JPanel panel = new JPanel();
        contentPane.add(panel, "name_273212774632866");
        panel.setLayout(null);

        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                panel_1.setVisible(true);
                panel.setVisible(true);

            }
        });
        btnNewButton.setBounds(126, 105, 89, 23);
        panel.add(btnNewButton);

        JPanel panel_1 = new JPanel();
        contentPane.add(panel_1, "name_273214471684839");
        panel_1.setLayout(null);

        JLabel lblHaiiiiiiiii = new JLabel("HAIIIIIIIII");
        lblHaiiiiiiiii.setBounds(159, 129, 46, 14);
        panel_1.add(lblHaiiiiiiiii);
    }
}

【问题讨论】:

    标签: java swing jpanel


    【解决方案1】:

    这个 JPanel 代码好吗?

    不是真的(抱歉),您应该使用 CardLayout 来使其工作,请参阅 How to Use CardLayout

    您还可以通过在构造函数中重新声明变量(panelpanel_1)来隐藏变量。

    您还应该避免使用null 布局,像素完美布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

    您也永远不会将panel_1 添加到contentPane,因此在其上调用setVisible(假设变量阴影已修复)不会做任何事情

    通常也不鼓励直接从 JFrame 或其他顶级容器扩展,您不会向类添加任何新功能,而是将自己锁定在单个用例中

    所以你可能会做一些更像...的事情

    import java.awt.CardLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.border.EmptyBorder;
    
    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new Govinda());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class Govinda extends JPanel {
    
            /**
             *
             */
            private static final long serialVersionUID = 1L;
            private JPanel panel;
            private JPanel panel_1;
    
            /**
             * Create the frame.
             */
            public Govinda() {
                setBorder(new EmptyBorder(5, 5, 5, 5));
                setLayout(new CardLayout(0, 0));
    
                JPanel panel = new JPanel();
                add(panel, "name_273212774632866");
    
                JButton btnNewButton = new JButton("New button");
                btnNewButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        ((CardLayout) getLayout()).show(Govinda.this, "name_273214471684839");
                    }
                });
                panel.add(btnNewButton);
    
                JPanel panel_1 = new JPanel();
                add(panel_1, "name_273214471684839");
    
                JLabel lblHaiiiiiiiii = new JLabel("HAIIIIIIIII");
                panel_1.add(lblHaiiiiiiiii);
            }
        }
    }
    

    您还可以考虑更多地使用Model-View-Controller 方法进行导航,因此用于确定下一个视图的逻辑将由控制器根据模型的要求来完成,例如,有一个看Listener Placement Adhering to the Traditional (non-mediator) MVC Pattern

    【讨论】:

    • 感谢您的详细帖子,我会关注这个。
    【解决方案2】:

    在您的actionPerformed() 方法中,您调用panel_1.setVisible(true)

    但是,您在构造函数中声明并实例化 panel_1。 一旦您完成了构造函数的执行,您就会超出范围并且panel_1 引用丢失(panel_1 可用于垃圾回收)。

    因此,当您调用 actionPerformed() 方法时,panel_1 并不存在。

    JPanel panel_1; 的声明与其他声明一起移动到类的顶部,然后才在构造函数中实例化panel_1panel_1 = new JPanel();

    【讨论】:

    • 即使在我添加后我也没有得到它,它显示给我同样的..所以请粘贴它吗??谢谢
    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多