【问题标题】:passing values from JPanel class to JFrame class将值从 JPanel 类传递到 JFrame 类
【发布时间】:2016-05-06 17:33:26
【问题描述】:

我有一个 JFrame,它使用从 JPanel 初始化的 JPanel。

这是 JFrame 类:LoginPage

public class LoginPage extends JFrame
{
private JPanel contentPane;
static int cnf;
static String data;
private static LoginPage frame;

/**
 * Launch the application.
 */
public static void main(String[] args)
{
    EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
            try
            {
                frame = new LoginPage();
                frame.setVisible(true); 
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    });

    //cnf = chk;
    if( cnf == 1)
    {
        frame.dispose();
        JFrame m = new MainPage();
        m.setVisible(true);
    }
}

/**
 * Create the frame.
 */
public LoginPage()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JPanel m = new MainLogin();
    m.setBounds(0, 0, 448, 271);
    contentPane.add(m);
}
}

而且,这是 JPanel 类:MainLogin

public class MainLogin extends JPanel
{
private JTextField uname;
private JPasswordField pass;
public static int chk;

public MainLogin()
{
    setLayout(null);

    uname = new JTextField();
    uname.setBounds(236, 22, 167, 25);
    add(uname);
    uname.setColumns(10);

    pass = new JPasswordField();
    pass.setBounds(236, 53, 167, 25);
    add(pass);

    JButton login = new JButton("Login");
    login.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            String u = uname.getText();
            char[] tp = pass.getPassword();
            String p = new String(tp);

            chk = authentication.verify(u, p);
            System.out.println(chk);
        }
    });
    login.setBounds(235, 90, 117, 25);
    add(login);
}
}

MainLogin面板一样,有一个类authentication有一个方法verify(),它返回一个整数,这个整数存储在chk中。 因为,这个chk 驻留在MainLogin JPanel 类中,我想将它传递给LoginPage JFrame 类。 除了使用文件之外,还有其他方法吗?

【问题讨论】:

  • 至于你的实现,你可以参考MainLogin.chkin you LoginPage class。
  • 1) setLayout(null); Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2)在这种情况下延长框架或面板的原因是什么?更喜欢组合而不是继承。

标签: java swing jframe jpanel parameter-passing


【解决方案1】:

LoginPage 实例而不是从 main 方法打开主页。

login() 方法添加到LoginPage

public class LoginPage extends JFrame {

    //other parts

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    frame = new LoginPage();
                    frame.setVisible(true); 
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }

    public LoginPage() {
        //...
        JPanel m = new MainLogin(this);
        //...
    }

    public void login(int chk) {
        JFrame m = new MainPage();
        m.setVisible(true);
        this.dispose();
    }
}

并将登录框作为参数传递给面板

public class MainLogin extends JPanel
{

private int chk;//no need to be static

public MainLogin(final LoginFrame loginFrame)
{
    setLayout(null);//null layout is bad

    //...
    login.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //...
            chk = authentication.verify(u, p);
            loginFrame.login(chk);
        }
    });
    //...
}
}

【讨论】:

    【解决方案2】:

    这个问题不仅被问了很多,它还有许多可能的解决方案,包括根据您的需要使用模态对话框或Observer Pattern

    详情请见How to Make Dialogs

    你可能还想看看

    关于该主题的更多讨论

    这里的基本答案是,您想要分离责任领域。

    你需要:

    • 收集用户凭据
    • 验证这些凭据
    • 根据检查是否成功采取适当的措施

    这是三个不同的操作,应该分开,验证凭据不是登录面板的责任,这是其他人的责任,同样,验证失败时决定应该做什么也不是验证者的责任或成功,那是别人的责任

    【讨论】:

    • 准确地说,我想关闭这个LoginPage JFrame 并在用户通过验证后实例化一个新的MainPage JFrame,即。 chk 值从 0 变为 1。
    • 是的,准确地说,登录面板收集用户详细信息,然后在这样的事件中,通知直接或间接验证凭据的控制器,然后根据结果通知某些导航控制器决定下一步应该去哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多