在另一个 class 中从 JTextField 编辑 JLabel

Editing JLabel from JTextField in another class

我环顾四周,但似乎没有任何帮助。基本上我正在用一个图形用户界面编写一个多线程聊天程序。用户在登录 class 的文本字段中输入他的名字,然后点击登录按钮,将他引导至 ClientGUI class。在客户端 GUI class 顶部有一个 JLabel,上面写着

"Welcome to the ChatSystem (Username)"

。因此,用户在登录 class 的文本字段中输入的内容应该出现在 "Welcome to the ChatSystem" 之后的 JLabel 中,但我不明白为什么它不起作用。这是我的代码:

登录Class:

loginB = new JButton("Login");
main.add(loginB);
loginB.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        ClientGUI clientgui = new ClientGUI();
        clientgui.setVisible(true);
    }
}

ClientGUI class:

public ClientGUI(){
    Login login = new Login();
    String username = login.usernameTF.getText();
    welcome = new JLabel("Welcome to ChatSystem "+username, SwingConstants.CENTER);

}

我知道用户名实际上应该是 JLabel 而不是字符串,但我已经尝试了很多方法来做到这一点,但我似乎无法理解这个问题。

那是行不通的,因为 login.usernameTF.getText();实际上是在ClientGUI构造函数中新建的对象...

我建议做的是重载构造函数并将名称作为参数传递...

示例:

 loginB.addActionListener(new ActionListener(){
     @Override
     public void actionPerformed(ActionEvent e) {
     ClientGUI clientgui = new ClientGUI(getTheNameAndpassItHere);
     clientgui.setVisible(true);
            }
        }

然后是 ClientGUI class:

public ClientGUI(String username){

    //Login login = new Login();
   // String username = login.usernameTF.getText();

    welcome = new JLabel("Welcome to ChatSystem "+username, SwingConstants.CENTER);

}

默认情况下,swings 组件是私有的,您需要通过一些小步骤 public 1.go到组件的属性,然后到代码选项卡 2.you 会发现变量修饰符为 private 使它们成为 public ,如果需要,也可以是 static 。

您现在可以使用具有相同代码的组件

基本上,您应该使用 Observer Pattern,它允许 ClientGUI 在发生变化时向感兴趣的各方生成事件。

这会分离您的代码并防止 ClientGUI 执行不该执行的操作(例如删除标签或其父组件)

您可以使用一些内置的监听器,如果它们满足您的需要,但对于这样的事情,我更愿意使用我自己的

public class LoginEvent extends EventObject {

    private Throwable cause;
    private String userName;

    public LoginEvent(Object source) {
        super(source);
    }

    public Throwable getCause() {
        return cause;
    }

    public String getUserName() {
        return userName;
    }

}

public interface LoginListener extends EventListener {
    public void loginFailed(LoginEvent evt);
    public void loginSuccessful(LoginEvent evt);
}

然后您可以将侦听器实例添加到 ClientGUI...

loginB.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        ClientGUI clientgui = new ClientGUI(getTheNameAndpassItHere);
        clientgui.addLoginListener(new LoginListener() {
            @Override
            public void loginFailed(LoginEvent evt) {
                Throwable cause = evt.getCause();
                // Show error message
            }

            @Override
            public void loginSuccessful(LoginEvent evt) {
                String name = evt.getUserName();
                // Update UI
            }
        });
        clientgui.setVisible(true);
    }
}

或类似的东西