Java 双击JButton中执行ActionEvent所需的

Java 双击JButton中执行ActionEvent所需的,java,swing,jframe,actionlistener,Java,Swing,Jframe,Actionlistener,我使用JFrame创建了一个简单的登录帧。 我有硬编码验证,其中如果用户以AKASH身份输入用户名,以12345身份输入密码,则按钮下方会显示登录成功,否则会显示错误密码 一切正常。唯一的问题是: 输入详细信息后,我必须双击查看结果 谁能帮我一下吗 这是我的密码: import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; pu

我使用JFrame创建了一个简单的登录帧。 我有硬编码验证,其中如果用户以AKASH身份输入用户名,以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);
            }
        }

    }


}

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

这只是猜测,因为您不应该使用空布局。Swing设计用于布局管理器。让布局管理器根据布局管理器的规则确定零部件的大小/位置

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

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
有关详细信息,请阅读上的Swing教程

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

是的,这很有效。但是你能详细说明一下这里需要的repaint()的概念吗?每当你更改组件的属性时,组件都需要重新绘制。通常,当您更改Swing组件时,组件将自动重新验证()本身并重新绘制(),因此您无需执行任何特殊操作。然而。面板是不同的。从面板添加/删除组件时,面板不知道何时完成,并且不希望继续调用布局管理器,因此需要执行重新验证()和重新绘制()在您完成对面板的所有更改后手动操作。很抱歉,我是StackOverflow的新手,对upvote没有太大的声誉。我为您@camickr进行了upvote操作,以获得良好的解释。:)
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();