在另一个类

时间:2016-04-19 19:38:12

标签: java swing jlabel jtextfield

我环顾四周,但似乎没有什么可以帮助我。基本上我用gui编写多线程聊天程序。用户在Login类的文本字段中输入他的名字,然后点击登录按钮,将他引导到ClientGUI类。在客户端GUI类中,顶部的JLabel表示

  

"欢迎使用ChatSystem(用户名)"

。那么登录类的文本字段中的用户输入应该在"欢迎来到ChatSystem"之后出现在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);
    }
}

ClientGUI类:

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

}

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

3 个答案:

答案 0 :(得分:2)

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

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

实施例

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

然后是ClientGUI类:

public ClientGUI(String username){

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

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

}

答案 1 :(得分:1)

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

或类似的东西

答案 2 :(得分:0)

swings组件默认是私有的,只需很少的步骤就可以将它们公开 1.转到组件的属性,然后转到代码选项卡 2.你会发现变量修饰符作为私有使它们公开,如果你想要它也是静态的。

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