【问题标题】:I need a JPanel to be displayed when I click on a JToggleButton单击 JToggleButton 时需要显示 JPanel
【发布时间】:2016-04-15 03:56:55
【问题描述】:

我有一个 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());
        }
    }
}

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

【问题讨论】:

标签: java swing events event-handling


【解决方案1】:

基本答案是使用CardLayout,有关详细信息,请参阅How to Use CardLayout

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

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

【讨论】:

  • 不错的解决方案,谢谢
猜你喜欢
  • 2013-05-20
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多