当有人单击按钮时,如何显示第二个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代码好吗?
并非如此(很抱歉),您应该使用a CardLayout来使其正常工作,请参阅如何使用CardLayout。
CardLayout
通过在构造函数中重新声明变量(panel和panel_1),您还可以隐藏变量。
panel
panel_1
您还应该避免使用null布局,像素完美布局是现代ui设计中的一种幻觉。有太多因素会影响组件的单个大小,您无法控制。Swing旨在与布局经理为核心一起工作,舍弃这些问题不会导致问题和问题的终结,您将花费越来越多的时间来尝试纠正问题
null
您也永远不会添加panel_1,contentPane因此对其进行调用setVisible(假设变量阴影已修复)将不会执行任何操作
contentPane
setVisible
通常也建议不要直接从JFrame其他顶级容器扩展它,也不要在该类中添加任何新功能,而只能将自己锁定在一个用例中
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); } } }
您可能还会考虑对导航使用更多的“ 模型-视图- 控制器”方法,因此用于确定下一个视图的逻辑将由控制器根据模型的要求进行,例如,看看在监听器放置秉承传统(非中介)MVC模式