繁体   English   中英

Java-无法从ActionListener打开新框架

[英]Java - Unable to open a new frame from ActionListener

我目前正在设计登录屏幕,但是遇到一个奇怪的问题。 我已经在swing的帮助下设计了GUI,是时候制作功能按钮了。 我想测试我的登录按钮,是否可以将我带到想要的框架,但是无法。 我可以设置一个JOptionPane.showMessageDialog,例如,它工作得很好,但是我无法从按钮打开另一个框架。 我尝试使用New JFrameName().setVisible(true) ,也JFrameName test = new JFrameName(); test.setVisible(true); JFrameName test = new JFrameName(); test.setVisible(true); ,但方法显示为红色。 这是我的代码。

package com.edu4java.swing.tutrial3;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LoginView {


    public static void main(String[] args) {
        JFrame frame = new JFrame("Bus Tour Booking System");
        frame.setSize(300, 200);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        frame.add(panel);
        placeComponents(panel);

        frame.setVisible(true);
    }

    private static void placeComponents(JPanel panel) {

        panel.setLayout(null);

        JLabel titleLabel = new JLabel("Bus Tour Booking System");
        titleLabel.setBounds(70,15,150,25);
        panel.add(titleLabel);

        JLabel userLabel = new JLabel("Username: ");
        userLabel.setBounds(30, 50, 80, 25);
        panel.add(userLabel);

        JTextField userText = new JTextField(20);
        userText.setBounds(120, 50, 130, 25);
        panel.add(userText);

        JLabel passwordLabel = new JLabel("Password: ");
        passwordLabel.setBounds(30, 80, 80, 25);
        panel.add(passwordLabel);

        JPasswordField passwordText = new JPasswordField(20);
        passwordText.setBounds(120, 80, 130, 25);
        panel.add(passwordText);

        JButton loginButton = new JButton("login");
        loginButton.setBounds(100, 125, 80, 25);
        panel.add(loginButton);

        ActionListener myButtonListener = new MyButtonListener();
        loginButton.addActionListener(myButtonListener);

    }

    private static class MyButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //can't access a new frame from here :(
        }
    }
    }

如果有人可以帮助我,我将非常感激,我在Stackoverflow和Reddit上读了很多书,但找不到解决方案。 我也是Java的新手,所以:D也无济于事。 提前致谢!

PS至于登录屏幕的实际功能,我将在稍后阶段进行。

这是您的登录类。 我将JFrame框架放在全局范围内,因此您可以从ButtonListener方法中对其进行操作。 我还创建了SomeFrame类,只是为了演示单击按钮时将创建的新JFrame。 当执行动作(单击按钮)时,将创建SomeFrame的新对象。 由于SomeFrame扩展了JFrame,我们可以将setVisible()方法用于SomeFrame对象。 出现SomeFrame框架,并且LoginView不再可见。

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LoginView {

 public static JFrame frame = new JFrame("Bus Tour Booking System");

    public static void main(String[] args) {

        frame.setSize(300, 200);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        frame.add(panel);
        placeComponents(panel);

        frame.setVisible(true);
    }

    private static void placeComponents(JPanel panel) {

        panel.setLayout(null);

        JLabel titleLabel = new JLabel("Bus Tour Booking System");
        titleLabel.setBounds(70,15,150,25);
        panel.add(titleLabel);

        JLabel userLabel = new JLabel("Username: ");
        userLabel.setBounds(30, 50, 80, 25);
        panel.add(userLabel);

        JTextField userText = new JTextField(20);
        userText.setBounds(120, 50, 130, 25);
        panel.add(userText);

        JLabel passwordLabel = new JLabel("Password: ");
        passwordLabel.setBounds(30, 80, 80, 25);
        panel.add(passwordLabel);

        JPasswordField passwordText = new JPasswordField(20);
        passwordText.setBounds(120, 80, 130, 25);
        panel.add(passwordText);

        JButton loginButton = new JButton("login");
        loginButton.setBounds(100, 125, 80, 25);
        panel.add(loginButton);

        ActionListener myButtonListener = new MyButtonListener();
        loginButton.addActionListener(myButtonListener);

    }

    private static class MyButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
           SomeFrame newFrame = new SomeFrame();
           newFrame.setVisible(true);
           frame.setVisible(false);
        }

      }
 }

这是SomeFrame类。

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SomeFrame extends JFrame {

    public SomeFrame(){
         super("something");
            this.setSize(300, 200);
            this.setResizable(false);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JPanel panel = new JPanel();
            this.add(panel);

            this.setVisible(true);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM