java - 我需要在单击 JToggleButton 时显示 JPanel

标签 java swing events event-handling

我有一个 JFrame 在一侧分成两部分,我有一个 JPanel,上面有一些 JToggleButtons。在另一侧,当单击其中一个 JToggleButtons 时,我需要显示正确的 JPanel。现在我只使用一个线程来执行此操作。

这是 JFrame

public class AppFrame extends JFrame{
    private JPanel content ;
    private JPanel menu;

    public AppFrame() {
        super("Title");
        setLayout(BorderLayout());
        //content is gonna hold JPanel1 or JPanel2
        content = new JPanel();
        menu = new menu();
        this.add(menu, BorderLayout.WEST);
        this.add(content , BorderLayout.CENTER);
    }

    public void setContet(JPanel activePanel){
        content = activePanel;
        this.add(content , BorderLayout.CENTER);
    }
}

这是持有 JToggleButtons (MenuJPanel) 的 JPanel

public class MenuJPanel extends JPanel{
private final LayoutManager innerLayout = new GridLayout(3,1,1,1);
private final JToggleButton button1;
private final JToggleButton button1;

public MenuPanel() {
    super();
    SwitchHandler sHandler = new SwitchHandler();
    this.setLayout(innerLayout);
    this.add(button1);
    this.add(button2);
    button1.addActionListener(sHandler);
    button2.addActionListener(sHandler);
}

class SwitchHandler implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button1){
            button2.setSelected(false);
            //at this point I want the frame to display JPanel1
            //I tried this
            AppFrame frame = (AppFrame)getTopLevelAncestor();
            frame.setContet(new JPanel1());
        } else {
            button1.setSelected(false);
            //at this point I want the frame to display JPanel2                
            //I tried this
            AppFrame frame = (AppFrame)getTopLevelAncestor();
            frame.setContet(new JPanel2());
        }
    }
}

有人可以告诉我当事件触发时如何在框架中打开这些面板吗? 谢谢

最佳答案

基本答案是使用 CardLayout,请参阅 How to Use CardLayout了解更多详情。

有很多方法可以做到这一点,但我更喜欢使用某种“导航 Controller ”,它负责实际处理使其工作的肮脏细节,这意味着如果您决定更改例如,您切换 View 的方式、代码的重置并不重要......

import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

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 TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public enum Page {
        MENU("menu"),
        HERE("here"),
        THERE("there");

        private String pageName;

        private Page(String name) {
            pageName = name;
        }

        public String getPageName() {
            return pageName;
        }

    }

    public interface Navigator {
        public void showPage(Page page);
    }

    public class TestPane extends JPanel implements Navigator {

        private CardLayout cardLayout;

        public TestPane() {
            cardLayout = new CardLayout();
            setLayout(cardLayout);
            add(new MenuPanel(this), Page.MENU.getPageName());
            add(new StuffOverHere(), Page.HERE.getPageName());
            add(new StuffOverThere(), Page.THERE.getPageName());
            showPage(Page.MENU);
        }

        @Override
        public void showPage(Page page) {
            cardLayout.show(this, page.getPageName());
        }

    }

    public class StuffOverHere extends JPanel {

        public StuffOverHere() {
            setLayout(new GridBagLayout());
            JLabel label = new JLabel("Over here");
            add(label);
        }

    }
    public class StuffOverThere extends JPanel {

        public StuffOverThere() {
            setLayout(new GridBagLayout());
            JLabel label = new JLabel("Over there");
            add(label);
        }

    }

    public class MenuPanel extends JPanel {

        private final LayoutManager innerLayout = new GridLayout(3, 1, 1, 1);
        private final JToggleButton button1 = new JToggleButton("Stuff over here");
        private final JToggleButton button2 = new JToggleButton("Stuff over there");

        private Navigator navigator;

        public MenuPanel(Navigator navigator) {
            super();
            SwitchHandler sHandler = new SwitchHandler();
            this.setLayout(innerLayout);
            this.add(button1);
            this.add(button2);
            button1.addActionListener(sHandler);
            button2.addActionListener(sHandler);
            this.navigator = navigator;
        }

        class SwitchHandler implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == button1) {
                    navigator.showPage(Page.HERE);
                } else {
                    navigator.showPage(Page.THERE);
                }
            }
        }
    }
}

关于java - 我需要在单击 JToggleButton 时显示 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36637989/

相关文章:

java - 我可以告诉 gradle 两个不同的依赖模块实际上是相同的并让它选择版本最高的那个吗?

javascript - 在按钮事件上加载 javascript 函数

java - 使用 gson 解析来自 google 地点的数据

Java 程序无法完成方法 - 在 for 循环后退出且没有错误

Java GUI 全屏窗口,内部窗口较小

java - 在基于 jtextpane 的 jtable 单元格渲染器中裁剪文本行

javascript - onClick 激活所有其他 onClick 事件

events - ItemInvoked 与 SelectionChanged

java - 不重复随机数

java - actionPerformed(ActionEvent e) 是否在与事件调度线程 (EDT) 不同的线程中运行?