Java 为什么不能找到我的可变设备号?

Java 为什么不能找到我的可变设备号?,java,swing,actionlistener,Java,Swing,Actionlistener,我有一份5页的申请 在第一页的地址面板上,您可以在文本字段中输入一些信息,如设备编号。然后单击一个按钮以更新其他页面并转到下一页LiftDataRevisionDocumentsPanel。上有一个JLabel,它应该显示您在第1页上输入的值 但无论我做什么,它都不会显示输入的值 我尝试了几个设备编号关键词:静态、最终、公共、私有,但没有任何变化。当我使用final时,我会在final字段中收到错误消息。。。无法分配 请注意:我在示例代码中没有使用前面提到的文本字段,而是尝试将字符串123456

我有一份5页的申请

在第一页的地址面板上,您可以在文本字段中输入一些信息,如设备编号。然后单击一个按钮以更新其他页面并转到下一页LiftDataRevisionDocumentsPanel。上有一个JLabel,它应该显示您在第1页上输入的值

但无论我做什么,它都不会显示输入的值

我尝试了几个设备编号关键词:静态、最终、公共、私有,但没有任何变化。当我使用final时,我会在final字段中收到错误消息。。。无法分配

请注意:我在示例代码中没有使用前面提到的文本字段,而是尝试将字符串1234567890直接放入equipmentNumber中。两种方法都不起作用,请参见ActionListener

那么为什么我不能在第二页上找到可变设备编号/更改标签

public class TestApplication {
    static String equipmentNumber;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestApplication window = new TestApplication();
                    window.frmTool.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public TestApplication() {
        initialize();
    }

    private void initialize() {
        frmTool = new JFrame();
        frmTool.setResizable(false);
        frmTool.setBounds(100, 100, 700, 850);
        frmTool.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmTool.getContentPane().setLayout(new CardLayout(0, 0));

        JButton btnAdoptData1 = new JButton("Use Data");
        btnAdoptData1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                equipmentNumber = "1234567890";
                AdressPanel.setVisible(false);
                DangerJudgementScrollPane.setVisible(true);
                DangerJudgementContentPanel.setVisible(true);
            }
        });

        GridBagConstraints gbc_btnAdoptData1 = new GridBagConstraints();
        gbc_btnAdoptData1.insets = new Insets(10, 10, 10, 10);
        gbc_btnAdoptData1.anchor = GridBagConstraints.EAST;
        gbc_btnAdoptData1.gridx = 0;
        gbc_btnAdoptData1.gridy = 6;
        AdressPanel.add(btnAdoptData1, gbc_btnAdoptData1);

        JLabel lblEquipmentnumberRevisionDocuments = new JLabel(equipmentNumber);
        GridBagConstraints gbc_lblEquipmentnumberRevisionDocuments = new GridBagConstraints();
        gbc_lblEquipmentnumberRevisionDocuments.anchor = GridBagConstraints.WEST;
        gbc_lblEquipmentnumberRevisionDocuments.insets = new Insets(0, 0, 5, 5);
        gbc_lblEquipmentnumberRevisionDocuments.gridx = 1;
        gbc_lblEquipmentnumberRevisionDocuments.gridy = 0;
        LiftDataRevisionDocumentsPanel.add(lblEquipmentnumberRevisionDocuments, gbc_lblEquipmentnumberRevisionDocuments);

问题不在于范围或可达性,而在于执行顺序

btnAdoptData1.addActionListener。。。设置ActionListener以在稍后单击按钮时执行,然后立即返回并继续使用initialize方法,该方法将立即创建新的JLabelequipmentNumber

这意味着在创建JLabel时,equipmentNumber变量仍有其默认值null。ActionListener和assignment equipmentNumber=1234567890直到稍后才会执行

如果希望JLabel反映键入的值,则只需在键入后设置标签文本。例如,做:

lblEquipmentnumberRevisionDocuments.setText(equipmentNumber);

当你显示那页的时候。或者在显示该页面之前根本不要创建标签。

问题不在于范围或可访问性,而在于执行顺序

btnAdoptData1.addActionListener。。。设置ActionListener以在稍后单击按钮时执行,然后立即返回并继续使用initialize方法,该方法将立即创建新的JLabelequipmentNumber

这意味着在创建JLabel时,equipmentNumber变量仍有其默认值null。ActionListener和assignment equipmentNumber=1234567890直到稍后才会执行

如果希望JLabel反映键入的值,则只需在键入后设置标签文本。例如,做:

lblEquipmentnumberRevisionDocuments.setText(equipmentNumber);

当你显示那页的时候。或者,在显示该页面之前,不要创建标签。

变量的作用域不取决于它的类型,而取决于声明它的方式和位置。对象没有作用域。它们具有可达性。变量有作用域,在大多数情况下,作用域由最近的封闭{}对分隔。你的问题毫无意义。我已经更改了问题的标题,因为这似乎与范围无关,而是与变量的可访问性有关。变量的范围不取决于它的类型,而取决于声明它的方式和位置。对象没有范围。它们具有可达性。变量有作用域,在大多数情况下,作用域由最近的封闭{}对分隔。你的问题没有意义。我已经更改了问题的标题,因为这似乎不是范围问题,而是变量的可访问性问题。似乎我理解添加组件的顺序错误?我想,第一页完成了,然后字符串被设置为1234567890,然后第二页被创建,并带有标签。它位于actionListener的下方。因此,我在这里的理解肯定是错误的?或者更清楚地说:首先,构建整个应用程序,然后添加ActionListener?它不是一页一页地解释,包括ActionListener,然后是下一页的标签…?在显示任何组件之前,您正在为这两个页面创建所有组件及其ActionListener。调用addActionListener不会等待操作发生。它只是设置了一个ActionListener供以后调用。似乎我理解了添加组件的顺序是错误的?我想,第一页完成了,然后字符串被设置为1234567890,然后第二页被创建,并带有标签。它位于actionListener的下方。因此,我在这里的理解肯定是错误的?或者更清楚地说:首先,构建整个应用程序,然后添加ActionListener?它不是一页一页地解释,包括ActionListener,然后是下一页的标签…?在显示任何组件之前,您正在为这两个页面创建所有组件及其ActionListener。调用addActionListener不会等待操作发生。它只是设置了一个ActionListener,以便稍后调用。