Java Swing中实现ActionListener时如何给JButton添加JPanel显示/隐藏功能
实现方案
修改要点
- 将3个彩色面板定义为类的成员变量,移除原有面板生成方法、按钮面板生成方法的
static修饰符,解决跨方法访问实例的问题 - 调整JFrame的GridLayout参数为
new GridLayout(2, 2),适配4个组件的布局展示 - 在按钮面板生成方法中为所有按钮绑定当前类的ActionListener实例
- 完善
actionPerformed方法逻辑,通过按钮的默认标识(按钮文本)判断操作类型,调用对应面板的setVisible方法控制显隐,操作后刷新界面
完整修改后代码
import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.Border; public class ShowHidePanels implements ActionListener { // 定义为类成员变量,方便跨方法访问 private JPanel greenPanel; private JPanel bluePanel; private JPanel redPanel; private JFrame frame; public static void main(String[] args) { new ShowHidePanels(); } public ShowHidePanels() { frame = new JFrame(); // 调整为2行2列布局,适配4个组件 frame.setLayout(new GridLayout(2, 2)); frame.add(bluePanel()); frame.add(greenPanel()); frame.add(redPanel()); frame.add(buttonPanel()); frame.setSize(950, 600); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public JPanel greenPanel() { String greenTitle = "Green Panel"; Border greenBorder = BorderFactory.createTitledBorder(greenTitle); // 给成员变量赋值 greenPanel = new JPanel(); greenPanel.setBorder(greenBorder); greenPanel.setBackground(new Color(165, 195, 70)); return greenPanel; } public JPanel bluePanel() { String blueTitle = "Blue Panel"; Border blueBorder = BorderFactory.createTitledBorder(blueTitle); // 给成员变量赋值 bluePanel = new JPanel(); bluePanel.setBorder(blueBorder); bluePanel.setBackground(new Color(80, 105, 212)); return bluePanel; } public JPanel redPanel() { String redTitle = "Kirmizi Panel"; Border redBorder = BorderFactory.createTitledBorder(redTitle); // 给成员变量赋值 redPanel = new JPanel(); redPanel.setBorder(redBorder); redPanel.setBackground(new Color(255, 100, 90)); return redPanel; } public JPanel buttonPanel() { Border greyBorder = BorderFactory.createTitledBorder("Grey Panel"); JButton b_BlueHide = new JButton("Hide Blue"); JButton b_BlueShow = new JButton("Show Blue"); JButton b_RedHide = new JButton("Hide Red"); JButton b_RedShow = new JButton("Show Red"); JButton b_GreenHide = new JButton("Hide Green"); JButton b_GreenShow = new JButton("Show Green"); // 为所有按钮绑定监听器 b_BlueHide.addActionListener(this); b_BlueShow.addActionListener(this); b_RedHide.addActionListener(this); b_RedShow.addActionListener(this); b_GreenHide.addActionListener(this); b_GreenShow.addActionListener(this); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(0, 1)); buttonPanel.setBorder(greyBorder); buttonPanel.setBackground(new Color(200, 200, 200)); buttonPanel.add(b_BlueHide); buttonPanel.add(b_BlueShow); buttonPanel.add(b_GreenHide); buttonPanel.add(b_GreenShow); buttonPanel.add(b_RedHide); buttonPanel.add(b_RedShow); return buttonPanel; } @Override public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); // 根据按钮文本判断操作 switch (command) { case "Hide Blue": bluePanel.setVisible(false); break; case "Show Blue": bluePanel.setVisible(true); break; case "Hide Green": greenPanel.setVisible(false); break; case "Show Green": greenPanel.setVisible(true); break; case "Hide Red": redPanel.setVisible(false); break; case "Show Red": redPanel.setVisible(true); break; } // 刷新窗口界面 frame.repaint(); } }
内容的提问来源于stack exchange,提问作者mihmandar
相关产品推荐
相关产品推荐

