Swing JPanel切换范围

时间:2013-03-04 22:31:25

标签: java swing user-interface jpanel

我是Swing的新手,我对Java的经验也很有限。我正在创建一个GUI但是为了进入主屏幕,首先需要登录。我的课程结构如下:

班级树的根:

public class master {

static mainwindow mainWindow;
static login loginScreen;

static JFrame frame;}

正确的用户名和密码的结果应该将面板从loginscreen切换到mainwindow。我的问题是,当在“登录”类中处理登录操作时,我无法访问我的mainWindow Panel或框架,因为它们位于“更高”的类中。

我希望我所要求的是清楚的,如果不是,我会用更多的代码和详细说明编辑我的帖子。

2 个答案:

答案 0 :(得分:3)

您不应该以您的方式使用静态变量或方法,为方法和变量提供全局范围,因为这样做会失去面向对象编程的许多优点。

你应该有一个主类,也许你可以称它为一个控制类,它运行所有东西并将引用传递给它所需要的位置。通常我的登录窗口是模态对话框,例如JDialog,它们是主窗口的模态,是JFrame。

例如,像......

public class MasterControl {
   private MainView mainView = new MainView(this);
   private LoginView loginView = new LoginView(this);

   public MasterControl() {
      loginAndStart();
   }

   private void loginAndStart() {
      JFrame frame = new JFrame("MasterControl");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainView.getMainPanel());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);

      JDialog loginDialog = new JDialog(frame, "Log In", ModalityType.APPLICATION_MODAL);
      loginDialog.getContentPane().add(loginView.getMainPanel());
      loginDialog.pack();
      loginDialog.setLocationRelativeTo(frame);
      loginDialog.setVisible(true);

      // here extract info from loginView, ask model to validate login credentials
      // and then change main view.
   }

答案 1 :(得分:3)

OO的一个重要概念是责任分离。

在您的情况下,Login组件不负责决定成功登录后应采取的操作(您也可以认为不成功)。

在这种情况下,您需要一些方法让登录组件通知感兴趣的各方登录过程的状态。最好使用像观察者模式这样的东西来实现。

基本上,这意味着你有一些可以对变化做出反应的监听器/回调。

在下面的示例中,我使用CardLayout作为切换视图的主要方法,但您也可以轻松地使用JDialog作为登录表单(因为Hovercraft已经完成后,一旦登录成功处理,就加载主框架。

enter image description here

public class TestCardLogin {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel implements LoginListener {

        private MainPane mainPane;
        private LoginPane loginPane;

        public TestPane() {
            setLayout(new CardLayout());

            mainPane = new MainPane();
            loginPane = new LoginPane(this);

            add(mainPane, "MAIN");
            add(loginPane, "LOGIN");

            ((CardLayout) getLayout()).show(this, "LOGIN");

        }

        @Override
        public void loginSuccessful() {
            ((CardLayout) getLayout()).show(this, "MAIN");
        }

        @Override
        public void loginFailed() {
            JOptionPane.showMessageDialog(TestPane.this, "Login failed", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    public class MainPane extends JPanel {

        public MainPane() {
            JLabel label = new JLabel("Welcome!");
            Font font = label.getFont();
            label.setFont(font.deriveFont(Font.BOLD, 32));
            setLayout(new GridBagLayout());
            add(label);
        }
    }

    public class LoginPane extends JPanel {

        private JTextField user;
        private JPasswordField password;
        private JButton login;
        private LoginListener loginListener;

        public LoginPane(LoginListener listener) {
            this.loginListener = listener;
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.EAST;
            add(new JLabel("User name:"), gbc);
            gbc.gridy++;
            add(new JLabel("Password:"), gbc);

            gbc.gridx++;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.WEST;

            user = new JTextField(12);
            password = new JPasswordField(12);

            add(user, gbc);
            gbc.gridy++;
            add(password, gbc);

            login = new JButton("Login");

            gbc.gridx = 0;
            gbc.gridy++;
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(login, gbc);

            login.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    boolean accept = (boolean) (((int) Math.round(Math.random() * 1)) == 0 ? true : false);
                    if (accept) {
                        loginListener.loginSuccessful();
                    } else {
                        loginListener.loginFailed();
                    }
                }
            });

        }
    }

    public interface LoginListener {

        public void loginSuccessful();

        public void loginFailed();
    }
}