有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

"Welcome to the ChatSystem (Username)"

。因此,登录类中文本字段中的用户输入应该在“欢迎使用聊天系统”之后出现在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) 个答案

  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. # 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);
    
    }
    
  3. # 3 楼答案

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

    现在,您将能够使用具有相同代码的组件