【问题标题】:Multiple JFrames, or JDialogs多个 JFrame 或 JDialog
【发布时间】:2013-05-21 06:49:27
【问题描述】:

从各种资源(本网站、一本书、一个朋友)中,我设法制作了一个响应按钮的JFrame(JFrame1)。它生成另一个JFrame (JFrame2),并将JFrame.setVisible() 更改为false

我想要做的是,当按下声明的后退按钮时,它会关闭JFrame2 并将JFrame1 可见性设置为true。没关系,但是当我执行JFrame2.setVisiblity(false) 时,JFrame2 仍然可见。我试过dispose();但这也不起作用。

我也想知道,因为我在 stackoverflow 上阅读过,创建多个 JFrames 是不好的编程。那么我应该改用JDialogs 吗?

我正在尝试显示一堆信息,并允许您与 GUI 交互以浏览信息。信息将按字母顺序排列。

另外,我不知道如何在这里发布代码,所以如果您需要查看我目前拥有的内容,请告诉我如何发布代码:D

【问题讨论】:

  • this
  • 像往常一样粘贴代码,然后只选择代码并按 Ctrl+K
  • 你应该使用一个 JFrame 和零个或多个 JDialogs

标签: java swing jframe awt jdialog


【解决方案1】:

最好使用单个框架,使用 JPanels 之类的东西来保存 UI 组件。这样您就可以根据需要简单地切换面板,可能使用CardLyout

通过将您的 UI 移至面板,您还可以解耦代码,赋予您更大的灵活性和重用潜力。

更新了基本示例

这基本上是使用一个简单的模型来改变不同的视图。你可以使用不同风格的模型来监听视图的变化,然后代表那里做出选择(这通常是我的首选方法),这取决于你想要做什么......

import java.awt.BorderLayout;
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.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class CardLayoutDemo {

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

    public CardLayoutDemo() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MasterPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class GameModel {

        private JPanel view;
        private JPanel lastView;
        private JPanel currentView;
        private WelcomePane welcomePane;
        private GamePane gamePane;
        private SettingsPane settingsPane;

        public GameModel(JPanel view) {
            this.view = view;

            welcomePane = new WelcomePane(this);
            gamePane = new GamePane(this);
            settingsPane = new SettingsPane(this);
        }

        public void welcome() {
            lastView = currentView;
            view.removeAll();
            view.add(welcomePane);
            view.revalidate();
            view.repaint();
            currentView = welcomePane;
        }

        public void newGame() {
            lastView = currentView;
            view.removeAll();
            view.add(gamePane);
            view.revalidate();
            view.repaint();
            currentView = gamePane;
        }

        public void settings() {
            lastView = currentView;
            view.removeAll();
            view.add(settingsPane);
            view.revalidate();
            view.repaint();
            currentView = settingsPane;
        }

        public void back() {
            if (lastView != null) {
                view.removeAll();
                view.add(lastView);
                view.revalidate();
                view.repaint();
                currentView = lastView;
                lastView = null;
            }
        }

    }

    public class MasterPane extends JPanel {

        public MasterPane() {
            setLayout(new BorderLayout());
            GameModel model = new GameModel(this);
            model.welcome();
        }

    }

    public class WelcomePane extends JPanel {

        private GameModel model;

        public WelcomePane(GameModel gameModel) {
            this.model = gameModel;
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            JButton btnStart = new JButton("New Game");
            JButton btnSettings = new JButton("Settings");

            add(new JLabel("Welcome"), gbc);
            add(btnStart, gbc);
            add(btnSettings, gbc);

            btnSettings.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    model.settings();
                }

            });

            btnStart.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    model.newGame();
                }

            });
        }

    }

    public class SettingsPane extends JPanel {

        private GameModel model;

        public SettingsPane(GameModel gameModel) {
            this.model = gameModel;
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(new JLabel("Go ahead, make some changes..."), gbc);

            JButton back = new JButton("Back");
            back.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    model.back();
                }
            });
            add(back, gbc);
        }

    }

    public class GamePane extends JPanel {

        private GameModel model;

        public GamePane(GameModel model) {
            this.model = model;
            setLayout(new GridBagLayout());
            add(new JLabel("All your base are belong to us"));
        }

    }
}

【讨论】:

  • 那我如何摆脱我的第一个屏幕?我的意思是,我的第一个屏幕是按字母顺序或搜索查找内容的选项。单击它后,我想关闭该框架,因此它只是搜索栏或浏览部分。
  • 你不需要摆脱框架。将所有 UI 组件(以及那里的逻辑)移动到 JPanels。当用户选择某些东西时,通知控制器来决定接下来需要显示什么......
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多