Java 在另一个类中从JTextField编辑JLabel

Java 在另一个类中从JTextField编辑JLabel,java,swing,jlabel,jtextfield,Java,Swing,Jlabel,Jtextfield,我环顾了四周,但似乎没有什么能帮到我。基本上,我正在用gui编写一个多线程聊天程序。用户在登录类的文本字段中输入自己的名字,然后点击登录按钮,将其指向ClientGUI类。在clientgui类的顶部有一个JLabel,它表示 “欢迎使用聊天系统(用户名)” 。因此,用户在login类的textfield中输入的内容应该出现在JLabel中的“欢迎使用聊天系统”之后,但我不明白为什么它不起作用。这是我的密码: 登录类别: loginB = new JButton("Login"); main.a

我环顾了四周,但似乎没有什么能帮到我。基本上,我正在用gui编写一个多线程聊天程序。用户在登录类的文本字段中输入自己的名字,然后点击登录按钮,将其指向ClientGUI类。在clientgui类的顶部有一个JLabel,它表示

“欢迎使用聊天系统(用户名)”

。因此,用户在login类的textfield中输入的内容应该出现在JLabel中的“欢迎使用聊天系统”之后,但我不明白为什么它不起作用。这是我的密码:

登录类别:

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

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

}
public ClientGUI(String username){

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

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

}

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

这不会像那样工作,因为
login.usernameTF.getText()实际上是在客户端GUI构造函数中创建的新对象

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

例子:
然后是ClientGUI类:

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

}
public ClientGUI(String username){

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

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

}

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

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

例子:
然后是ClientGUI类:

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

}
public ClientGUI(String username){

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

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

}

swings组件在默认情况下是私有的,您只需一小步就可以将其公开 1.转到组件的属性,然后转到“代码”选项卡 2.你会发现变量修饰符是私有的,如果你愿意的话,可以将它们公开,也可以是静态的。


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

默认情况下,swings组件是私有的,您只需几步就可以将它们公开 1.转到组件的属性,然后转到“代码”选项卡 2.你会发现变量修饰符是私有的,如果你愿意的话,可以将它们公开,也可以是静态的。


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

基本上,您应该使用,它允许
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);
    }
}

或者类似的东西基本上,您应该使用,它允许
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);
    }
}

或者类似的东西

我不认为更改变量的保护值是最好的方法,但可能会在变量中添加访问器和变异器。我不认为更改变量的保护值是最好的方法,但可能会在变量中添加访问器和变异器。谢谢,这似乎是可行的,但如果你能向我解释为什么在构造函数中创建一个新对象不能完成交易,这将是有帮助的,这不是因为在构造函数内部,而是因为你正在创建一个新登录名,所有日期都是新的,与你之前的登录名无关。好的,我现在明白了,谢谢。我遇到了另一个问题,在ClientGUI的主方法中,当我将框架设置为可见时,如下所示:“newclientgui(username).setVisible(true);”我得到一个错误,它说username不能解析为变量。你知道怎么解决这个问题吗?抱歉,我知道这一定是个愚蠢的问题,但我对Java相当陌生,用户名是字符串吗??如果是,在哪里定义?username是在构造函数外部定义的字符串。在构造函数中,我调用this.username=username来匹配username的构造函数参数。然后,它告诉我在用户名下的什么位置显示“newclientgui(username).setVisible(true);”以将其更改为静态。根据过去的经验,我被告知永远不要将变量更改为静态变量,除非我理解为什么要这样做。它似乎是可行的,但如果你能向我解释为什么在构造函数中创建一个新对象并不能解决问题,那将是有帮助的,不是因为在构造函数中,这是因为您正在创建一个新的登录名,所有日期都是新的,与您以前的登录名无关。好的,我现在明白了,谢谢。我遇到了另一个问题,在ClientGUI的主方法中,当我将框架设置为可见时,如下所示:“newclientgui(username).setVisible(true);”我得到一个错误,它说username不能解析为变量。你知道怎么解决这个问题吗?抱歉,我知道这一定是个愚蠢的问题,但我对Java相当陌生,用户名是字符串吗??如果是,在哪里定义?username是在构造函数外部定义的字符串。在构造函数中,我调用this.username=username来匹配username的构造函数参数。然后,它告诉我在用户名下的什么位置显示“newclientgui(username).setVisible(true);”以将其更改为静态。根据过去的经验,我被告知永远不要将变量更改为静态变量,除非我理解为什么要这样做。设置文本并通过ClientGUI传递它似乎是可行的,但我也对其他方法感兴趣。我读了一些关于观察者模式的书,看看它们是如何工作的,但似乎不太了解(我是一个相当新的程序员)。你能解释一下你的方法比仅仅获取文本和通过i有什么优势吗