在其他类中更改变量

时间:2016-04-11 17:43:22

标签: 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 ...

    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在这里没有变化。如果需要,我可以发布整个代码(尝试制作类似聊天的摇摆应用程序)

由于

3 个答案:

答案 0 :(得分:0)

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

您应该将port参数添加到构造函数中,如下所示:

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

或更新你的setPort()方法:

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

答案 1 :(得分:0)

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

尝试在Window类代码中使用类似的东西:

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);
    }
}

答案 2 :(得分:0)

我必须承认,不建议在构造函数中进行实际工作:

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

 Window tester = new Window();

您的构造函数已被调用,您的JLabel已使用“默认”端口

进行初始化

我建议对构造函数进行以下更新,即传递构造的JLabel,这样可以更好地控制输入。

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

希望这有帮助。