You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:15:01