Java 更改其他类中的变量

Java 更改其他类中的变量,java,swing,Java,Swing,当更改在另一个对象的构造函数中初始化的变量时,我会遇到问题 JFrame: public class Window extends JFrame { private String ip = "default"; private String port = "default"; private String nameClient = "default"; // getters and setters, including setPort ... pu

当更改在另一个对象的构造函数中初始化的变量时,我会遇到问题

JFrame:

public class Window extends JFrame {

    private String ip = "default";
    private String port = "default"; 
    private String nameClient = "default";

    // getters and setters, including setPort ...

    public void setPort(String port) {
        this.port = port;
    }

    public Window() {
        JLabel numPort = new JLabel(port);
        numPort.setBounds(149, 77, 46, 14);
        add(numPort);
    }
}
在测试类中:

public class TestWindow {
    public static void main(String[] args){
        String validate = "1234";

        Window tester = new Window();
        tester.setPort(validate);
    }
}
对不起,我的问题是noob,但是我不明白为什么Jlabel在这里没有改变。如果需要,我可以发布整个代码(尝试创建类似swing的聊天应用程序)


感谢您在构造函数中设置要标记的值。此值基于当前端口值。 在测试类中,使用默认端口值创建新的窗口实例,然后才更改端口值(但它显然不会影响已创建的标签)

您应该向构造函数添加端口参数,如下所示:

public Window(String port) {
        JLabel numPort = new JLabel(port);
        numPort.setBounds(149, 77, 46, 14);
        add(numPort);
}
或者更新setPort()方法:


您正在更新Window类中的值,但不在JLabel中。Java字符串是不可变的,因此重新分配实际上会导致Windows类上的变量指向字符串的新实例,而不是更改字符串的值

尝试在窗口类代码中使用类似的内容:

public class Window extends JFrame {

    private String ip = "default";
    private String port = "default"; 
    private String nameClient = "default";
    private JLabel numPort; //converted to a instance variable

    // getters and setters, including setPort ...

    public void setPort(String port) {
        this.port = port;
        numPort.setText(port); 
    }

    public Window() {
        numPort = new JLabel(port);
        numPort.setBounds(149, 77, 46, 14);
        add(numPort);
    }
}

我必须承认,不建议在施工人员中进行实际工作:

现在,窗口标签没有更改的原因是,当您在main中执行以下操作时

 Window tester = new Window();
您的构造函数被调用,您的JLabel已经用“默认”端口初始化

我建议对构造函数进行以下更新,即传递一个构造的JLabel,这将使您能够更好地控制输入

public Window(JLabel label) {
    ......
}

希望这有帮助。

发布方法窗口。setPort()。。。我们需要看看你在那里做什么……我想这是因为
setPort
只更新
port
的值,而不更新
numPort
。但是,如果你想要一个非猜测的答案,你需要发布你正在询问的代码。我的另一个猜测是,你认为更新
port
的值会以某种方式更新
numPort
,但它不会(参见)。@azurefrog是的,我在想,因为我的想法是:如果我更改JLabel实例参数,在新实例中设置该值时,它将更改该值。谢谢大家!是的,当我在setport中添加settext时,它起了作用。谢谢
public Window(JLabel label) {
    ......
}