我环顾四周,但似乎没有什么可以帮助我。基本上我用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,而不是字符串,但我已经尝试了很多方法来做到这一点,我似乎无法理解这一点。
答案 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)