当前位置: 首页 > 知识库问答 >
问题:

如何将在另一个类中创建的面板添加到JFrame

禄光霁
2023-03-14

我目前正在尝试为游戏创建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();

共有1个答案

丁弘新
2023-03-14

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

对我来说,它的一个限制因素是,通常需要对每个要切换到的容器进行实例化和添加。在内存使用方面,这会让它变得“沉重”,在面板之间传递信息时也会变得困难——因为它很难抽象工作流,不是不可能,只是有问题。

其中一个很好的特性是,till会根据所有其他容器自动确定所需的UI大小。

查看如何使用CardLayout

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

这可以通过使用委托、观察者模式和依赖注入来实现。

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

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

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

    }
}
 类似资料:
  • 我有一个活动选项卡的自动播放选项卡类current,这意味着当该选项卡活动时, 有一个名为current的类。现在我要向第一个子 添加不同的类 null null

  • 问题内容: 我创建了一个框架,然后在其中创建了面板。我已经将图像放置在一个 面板中,现在我需要将该图像拖动到另一个面板中。我该怎么做。 请作为初学者逐步说明。 问题答案: 使用纯Java的快速示例DragGestureListener,DropTargetAdapter并 TransferHandler为一个面板上的图像对另一面板的DnD支持: 选择绿色形状并将其拖动到上方的空白面板后:

  • 我是java新手,我正试图编写我的第一个“更大”的程序,包含几个类。我在类“CompetitionProgram”中创建了一个ArrayList并将其声明为private。 我的程序中需要这两个类(Event&ListOfEvents),这是需求之一。事件--它只是表示事件本身,比如事件名称和尝试次数(它是一个体育事件)。和ListOfEvents--它表示列表本身,并包含用于添加事件、删除事件和

  • 问题内容: 我正在尝试开发在线酒店预订系统。我有一个主类,它从用户那里获取输入信息,例如他们的姓名,他们的付款信息和其他数据字段,并使用该信息作为对象。我有另一个名为的类,其中包含每个对象的列表。我遇到的问题是我无法找出一种将对象添加到对象列表中的方法。这是一些代码: 我不知道如何获取新对象作为类中方法的参数传递。我只是束手无策,希望有人能帮助我慢跑。 谢谢你的帮助。 问题答案: 让makeRes

  • 我正在构建一个Java程序。该程序的核心在JFrame中可视化,其中包含一个JMenuBar和各种JMenuItem和JMenu。关键是我在所有框架中添加了一个centralPanel,但是如果我在centralPanel中添加了一些内容,那么只有在调整主框架的大小、缩小或放大它时,它才会显示出来!代码如下: 这是构造函数: 在这里,我添加了中央面板,在这里,在ActionListener中,我试