这个JPanel代码好吗? 单击按钮时不显示其他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); } } 

这个JPanel代码好吗?

不是真的(抱歉),您应该使用CardLayout来实现这一点,请参阅如何使用CardLayout

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

您还应该避免使用null布局,像素完美布局是现代ui设计中的错觉。 影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正

你也永远不会将panel_1添加到contentPane因此在其上调用setVisible (假设变量阴影是固定的)将不会做任何事情

通常不鼓励直接从JFrame或其他顶级容器扩展,你没有向类中添加任何新function并将自己锁定在一个用例中

所以你可能会做更像……的事情。

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

您还可以考虑使用更多的模型 – 视图 – 控制器方法来导航,因此用于确定下一个视图的逻辑将由控制器根据模型的要求进行,例如,看看在倾听者的位置坚持传统(非中介)MVC模式

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

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

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

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