为什么我的变量equipmentNumber不能到达?

ham*_*314 1 java swing actionlistener

我有一个5页的应用程序.

在第一页(AdressPanel)上,您将一些信息(如equipmentNumber)输入到文本字段中.然后单击按钮以更新其他页面并转到下一页(LiftDataRevisionDocumentsPanel).在JLabel上应该显示您在第1页上输入的值.

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

我尝试了几个关键字equipmentNumber:static, final, public, private但没有任何变化.当我使用final时,我收到错误消息the final field ... cannot be assigned.

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

那么为什么我无法到达变量equipmentNumber/更改第二页上的标签?

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);
Run Code Online (Sandbox Code Playgroud)

Boa*_*ann 6

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

btnAdoptData1.addActionListener(...)设置一个ActionListener以便在单击按钮后执行,然后立即返回并继续该initialize方法,该方法立即创建new JLabel(equipmentNumber).

这意味着在您创建时JLabel,equipmentNumber变量仍然具有其默认值null.在ActionListener与分配equipmentNumber = "1234567890"不执行,直到后来.

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

lblEquipmentnumberRevisionDocuments.setText(equipmentNumber);
Run Code Online (Sandbox Code Playgroud)

当你显示该页面时.或者在显示该页面之前不要创建标签.

  • 在显示任何页面之前,您将为两个页面创建所有组件及其`ActionListeners`.调用`addActionListener`不会等待操作发生.它只是设置一个稍后调用的`ActionListener`. (2认同)