【问题标题】:Double click required for performing ActionEvent in JButton在 JButton 中执行 ActionEvent 需要双击
【发布时间】:2018-09-27 16:10:24
【问题描述】:

我使用 JFrame 创建了一个简单的登录框架。 我有硬编码验证,其中如果用户输入 username 作为 AKASHpassword 作为 12345 然后 登录成功显示在按钮下方,否则显示密码错误

一切正常。唯一的事情是:

输入详细信息后我必须双击才能看到结果

谁能帮帮我。

这是我的代码:

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

public class LginForm extends JFrame implements ActionListener{

    Container c;
    JTextField jt;
    JButton jb;
    JPasswordField jp;
    JLabel jl1,jl2;
    JLabel jl3 = new JLabel("Wrong Password");
    JLabel jl4 = new JLabel("Login Successful");


    public static void main(String[] args) {

        LginForm lf = new LginForm();
        lf.setBounds(100, 50, 500, 400);
        lf.setVisible(true);
        lf.setDefaultCloseOperation(EXIT_ON_CLOSE);


    }

    public LginForm() {

        c = this.getContentPane();
        c.setBackground(Color.yellow);
        c.setLayout(null);

        jl1 = new JLabel("Enter Username");
        jl1.setBounds(50, 10, 100, 30);
        jl1.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 12));


        jl2 = new JLabel("Enter Password");
        jl2.setBounds(50, 100, 100, 30);
        jl2.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 12));


        jt = new JTextField();
        jt.setBounds(200,10,100,30);


        jp = new JPasswordField();
        jp.setBounds(200,100,100,30);


        jb = new JButton("login");
        jb.setBounds(130,180,80,30);
        c.add(jl1);
        c.add(jl2);
        c.add(jt);
        c.add(jp);
        c.add(jb);
        jb.addActionListener(this);



    }

    @Override
    public void actionPerformed(ActionEvent event) {


        if(event.getSource() == jb) {
            String usrname = jt.getText();
            String passwrd = String.valueOf(jp.getPassword());
            if(usrname.equals("Akash") && passwrd.equals("12345")) {
                jl4.setBounds(100, 230, 150, 40);
                jl4.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 12));
                c.add(jl4);
                c.remove(jl3);
            }
            else {
                jl3.setBounds(100, 230, 150, 40);
                jl3.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 12));
                c.add(jl3);
                c.remove(jl4);
            }
        }

    }


}

This the login frame created

【问题讨论】:

    标签: java swing jframe actionlistener


    【解决方案1】:
    c.add(jl4);
    c.remove(jl3);
    

    我猜想在面板中添加/删除组件后,您需要调用repaint() 面板。

    这只是一个猜测,因为您不应该使用空布局。 Swing 旨在与布局管理器一起使用。让布局管理器根据布局管理器的规则确定组件的大小/位置。

    然后,当您从面板中添加/删除组件时,基本逻辑将是:

    panel.remove(...);
    panel.add(...);
    panel.revalidate();
    panel.repaint();
    

    阅读Using Layout Managers 上的 Swing 教程了解更多信息。

    注意:

    我还建议一个更简单的解决方案是将“消息标签”添加到面板中,并将文本设置为“”。然后你可以简单地使用标签的setText(...) 方法来更改消息。这样您甚至无需担心添加/删除组件。

    【讨论】:

    • 是的,有效。但是你能详细说明这里需要的 repaint() 的概念吗?
    • 每当您更改组件的属性时,都需要重新绘制组件。通常,当您更改 Swing 组件时,该组件将自动 revalidate() 本身和 repaint() 本身,因此您不需要做任何特别的事情。然而。面板是不同的。从面板添加/删除组件时,面板不知道您何时完成并且您不想继续调用布局管理器,因此您需要在完成所有操作后手动执行 revalidate() 和 repaint()对面板的更改。
    • 致歉,因为我是 StackOverflow 的新手,并且在投票方面没有相当的声誉。
    • 我为你投了赞成票@camickr 以获得良好的解释。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2016-03-01
    • 2015-11-18
    相关资源
    最近更新 更多