这个JPanel代码好吗?单击按钮时不显示其他JPanel

时间:2016-02-18 01:08:48

标签: java swing jpanel

当有人点击按钮时,如何显示第二个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);
    }
}

2 个答案:

答案 0 :(得分:1)

  

这个JPanel代码好吗?

不是真的(对不起),您应该使用CardLayout来实现这一点,请参阅How to Use CardLayout

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

您还应该避免使用null布局,像素完美布局是现代ui设计中的错觉。影响组件个体大小的因素太多,您无法控制。 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

答案 1 :(得分:0)

actionPerformed()方法中,您拨打panel_1.setVisible(true)

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

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

JPanel panel_1;的声明移到您的类的顶部,连同其他声明,然后在构造函数中实例化panel_1panel_1 = new JPanel();