【问题标题】:How to add a panel created in another class to a JFrame如何将在另一个类中创建的面板添加到 JFrame
【发布时间】:2021-12-04 22:11:17
【问题描述】:

我目前正在尝试为游戏创建 GUI。我有一个带有多个按钮的第一个面板的 JFrame。单击后,我应该更改面板。它的工作原理是我创建了第一个框架类

public class FirstWindow extends JFrame implements ActionListener 

这个类包含让我们改变面板的按钮。为此,我在扩展 JPanel 的不同类中创建了面板。它有效,但我被阻止了,因为在第二个面板中我仍然需要参考其他面板,但我不再可以访问我的初始 JFrame。

举例说明:这就是我从不同的JPanel 切换的方式。 “this”是指我不能在其他类中使用的框架

public void actionPerformed(ActionEvent e) {
      if ( "START".equals(e.getActionCommand())){
            this.setContentPane(new PanelHello());
            this.invalidate();
            this.validate();
        }else if ("EXIT".equals((e.getActionCommand()))) {
          this.dispose();
          this.invalidate();
          this.validate();
      }else if (!( usernameText.getText().equals(""))){
          this.setContentPane(new PanelHello());
          this.invalidate();
          this.validate();public void actionPerformed(ActionEvent e) {
      if ( "START".equals(e.getActionCommand())){
            this.setContentPane(new PanelHello());
            this.invalidate();
            this.validate();
        }else if ("EXIT".equals((e.getActionCommand()))) {
          this.dispose();
          this.invalidate();
          this.validate();
      }else if (!( usernameText.getText().equals(""))){
          this.setContentPane(new PanelHello());
          this.invalidate();
          this.validate();

【问题讨论】:

  • 使用CardLayout 交换面板。阅读 How to Use CardLayout 上的 Swing 教程,了解一个可以帮助您更好地构建代码的工作示例。您不需要仅引用具有 CardLayout 的面板的框架。
  • 另外,您不应该在 ActionListener 中使用 if/else 语句。每个按钮都应该有自己的 ActionListener 和与该按钮的操作特别相关的自定义。或者在这种情况下,您可以使用通用代码共享单个 ActionListener。也就是说,您从按钮中获取“操作命令”,然后使用该值来确定要在 CardLayout 中交换哪个面板。
  • @camickr 我尝试在每个按钮内使用匿名和新的 ActionListener,但它不起作用。这种添加动作的方式是我的代码中唯一有效的方式,我不知道为什么
  • 这部分形成了“委托”和“观察者”模式的概念。如果它是刻薄的,我会有某种“导航控制器”来管理核心导航。然后每个面板将提供某种“观察者”合同,允许导航控制器监控何时应该发生更改并采取适当的行动
  • 这是一个 simple example,将来自不同类的 JPanel 添加到最近 Stack Overflow 问题中的 JFrame

标签: java swing


【解决方案1】:

CardLayout

CardLayout 布局管理器是一个非常有用的布局管理器,可以用来在不同的容器之间切换。

对我来说,它的一个限制因素是,通常需要拥有您想要切换到、实例化和添加的每个容器。就内存使用而言,这可能会使其“繁重”,并且在面板之间传递信息时会变得困难 - 因为它很难抽象工作流程,并非不可能,只是有问题。

其中一个不错的功能是根据所有其他容器自动确定所需的 UI 大小。

How to Use CardLayout

自定义导航

我经常发现自己需要做的一件事是通过 UI 进行某种非线性进程,并且需要能够有效地将信息来回传递到不同的容器。

可以通过使用delegationobserver patterndependency injection来完成。

这里的基本原则是,您可能有许多导航控制器,每个控制器都管理一个特定的工作流程,独立于所有其他控制器。这种分离简化了应用程序的需求,并且在需要时更容易移动事物,因为任何一个工作流都不会与另一个工作流耦合。

这里没有演示的另一个方面是向导航控制器返回信息的能力,例如,如果您有一个登录/注册工作流程,工作流程可以通过返回一个“用户”实例来结束控制器然后能够确定他们接下来需要通过哪个工作流程(管理员/版主/基本/等)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new MasterPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MasterPane extends JPanel {

        private MenuPane menuPane;

        public MasterPane() {
            setLayout(new BorderLayout());
            presentMenu();
        }

        protected void presentMenu() {
            removeAll();

            if (menuPane == null) {
                menuPane = new MenuPane(new MenuPane.NavigationListener() {
                    @Override
                    public void presentRedPane(MenuPane source) {
                        RedPane redPane = new RedPane(new ReturnNavigationListener<RedPane>() {
                            @Override
                            public void returnFrom(RedPane source) {
                                presentMenu();
                            }
                        });
                        present(redPane);
                    }

                    @Override
                    public void presentGreenPane(MenuPane source) {
                        GreenPane greenPane = new GreenPane(new ReturnNavigationListener<GreenPane>() {
                            @Override
                            public void returnFrom(GreenPane source) {
                                presentMenu();
                            }
                        });
                        present(greenPane);
                    }

                    @Override
                    public void presentBluePane(MenuPane source) {
                        BluePane bluePane = new BluePane(new ReturnNavigationListener<BluePane>() {
                            @Override
                            public void returnFrom(BluePane source) {
                                presentMenu();
                            }
                        });
                        present(bluePane);
                    }
                });
            }

            add(menuPane);
            revalidate();
            repaint();
        }

        protected void present(JPanel panel) {
            removeAll();
            add(panel);
            revalidate();
            repaint();
        }

    }

    public class MenuPane extends JPanel {

        public static interface NavigationListener {
            public void presentRedPane(MenuPane source);
            public void presentGreenPane(MenuPane source);
            public void presentBluePane(MenuPane source);
        }

        private NavigationListener navigationListener;

        public MenuPane(NavigationListener navigationListener) {
            this.navigationListener = navigationListener;

            setBorder(new EmptyBorder(16, 16, 16, 16));
            setLayout(new GridBagLayout());

            JButton red = new JButton("Red");
            red.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    getNavigationListener().presentRedPane(MenuPane.this);
                }
            });
            JButton green = new JButton("Green");
            green.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    getNavigationListener().presentGreenPane(MenuPane.this);
                }
            });
            JButton blue = new JButton("Blue");
            blue.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    getNavigationListener().presentBluePane(MenuPane.this);
                }
            });

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.BOTH;

            add(red, gbc);
            add(green, gbc);
            add(blue, gbc);
        }

        protected NavigationListener getNavigationListener() {
            return navigationListener;
        }

    }

    public interface ReturnNavigationListener<T> {

        public void returnFrom(T source);
    }

    public class RedPane extends JPanel {

        private ReturnNavigationListener<RedPane> navigationListener;

        public RedPane(ReturnNavigationListener<RedPane> navigationListener) {
            this.navigationListener = navigationListener;
            setBackground(Color.RED);
            setLayout(new BorderLayout());
            add(new JLabel("Roses are red", JLabel.CENTER));

            JButton back = new JButton("Back");
            back.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    getReturnNavigationListener().returnFrom(RedPane.this);
                }
            });
            add(back, BorderLayout.SOUTH);
        }

        public ReturnNavigationListener<RedPane> getReturnNavigationListener() {
            return navigationListener;
        }

    }

    public class BluePane extends JPanel {

        private ReturnNavigationListener<BluePane> navigationListener;

        public BluePane(ReturnNavigationListener<BluePane> navigationListener) {
            this.navigationListener = navigationListener;
            setBackground(Color.BLUE);
            setLayout(new BorderLayout());
            add(new JLabel("Violets are blue", JLabel.CENTER));

            JButton back = new JButton("Back");
            back.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    getReturnNavigationListener().returnFrom(BluePane.this);
                }
            });
            add(back, BorderLayout.SOUTH);
        }

        public ReturnNavigationListener<BluePane> getReturnNavigationListener() {
            return navigationListener;
        }

    }

    public class GreenPane extends JPanel {

        private ReturnNavigationListener<GreenPane> navigationListener;

        public GreenPane(ReturnNavigationListener<GreenPane> navigationListener) {
            this.navigationListener = navigationListener;
            setBackground(Color.GREEN);
            setLayout(new BorderLayout());
            add(new JLabel("Kermit is green", JLabel.CENTER));

            JButton back = new JButton("Back");
            back.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    getReturnNavigationListener().returnFrom(GreenPane.this);
                }
            });
            add(back, BorderLayout.SOUTH);
        }

        public ReturnNavigationListener<GreenPane> getReturnNavigationListener() {
            return navigationListener;
        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2014-03-12
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多