【问题标题】:Why does this integer return 0 although it's not 0?为什么这个整数返回 0 虽然它不是 0?
【发布时间】:2017-01-25 08:35:03
【问题描述】:

我正在创建一个应该执行控制台命令的软件。该命令因您在实际应用程序中设置的配置而异。

问题是,其中一个命令(总共 4 个)需要捕获一个整数才能用于配置。

整数由下拉列表通过以下代码设置:

private String[] osList = {"Choose OS", "Windows 7 Pro", "Windows 7 Home Basic", "Windows 7 Home Premium", "Windows 7 Ultimate"};
private JComboBox osDropDown = new JComboBox(osList);
public int osIndex;

osDropDown.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED) {
                    Object item = e.getItem();

                    if(item.equals(osList[1])) {
                        osIndex = 3;
                    } else if(item.equals(osList[2])) {
                        osIndex = 1;
                    } else if(item.equals(osList[3])) {
                        osIndex = 2;
                    } else if(item.equals(osList[4])) {
                        osIndex = 4;
                    }
                }
            }
        });

如您所见,变量 osIndex 应该设置为 3,例如,如果您选择“Windows 7 pro”。
这是执行的命令:

"dism /mount-wim /wimfile:install.wim /index:" + formPanel.osIndex + " /mountdir:mount"

但由于某些奇怪的原因,无论我选择列表中的哪个项目,它都会在 osIndex 上返回 0。我不知道为什么?

如果我使用此代码,当我在列表中选择 osIndex 时,它会输出正确的值。但是当我选择后尝试运行命令时,它仍然返回0。

if(item.equals(osList[1])) {
    osIndex = 3;
    System.out.println(osList[1] + " [" + osIndex + "]");
} else if(item.equals(osList[2])) {
    osIndex = 1;
    System.out.println(osList[2] + " [" + osIndex + "]");
} else if(item.equals(osList[3])) {
    osIndex = 2;
    System.out.println(osList[3] + " [" + osIndex + "]");
} else if(item.equals(osList[4])) {
    osIndex = 4;
    System.out.println(osList[4] + " [" + osIndex + "]");
}

编辑:似乎数组中的命令已设置并且一旦我更改列表中的项目就不会更改。当我更改列表项时,我需要以某种方式做到这一点;这就是将数组中的命令分配给变量的地方。关于如何做到这一点有什么好主意吗?

编辑2:通过这样做解决它;一旦我单击“开始”按钮,它会将数组中的命令文本设置为:

cmdExec.cmd[3] = "dism /mount-wim /wimfile:install.wim /index:" + formPanel.getOsIndex() + " /mountdir:mount";

这不可能是最好的解决方案,但它几乎是我目前唯一能想到的解决方案。如果有人有更好的想法,请告诉我!

【问题讨论】:

  • 可能e.getItem() 不等于您与之比较的任何字符串。
  • 因为没有输入if语句...
  • 因为一个字段的默认值为0,而你的监听器可能永远不会执行或永远不会到达osIndex = 3
  • 生成命令的代码在哪里?特别是:它是否可能在事件发生之前运行?你需要在监听器运行它,而不是在监听器外。
  • 如果没有可运行的示例,我们建议的任何内容都只是猜测

标签: java swing variables integer


【解决方案1】:

没有“返回”。根本不会重新分配默认值。

真实测试 - 使用调试器并设置一些断点。 System.out 是一种不稳定的测试方法

但由于您的字符串打印正常,看来您每次更新 osIndex 变量时都需要创建一个新的命令字符串

【讨论】:

  • 根据 OP 编辑​​,if 语句(和比较)可以正常工作。
  • 不清楚该代码是从哪里调用的,不过
  • @Eran 我用实际问题更新了原始帖子。所以现在我知道了这个问题(至少有某种进展),但不知道如何更新它
  • 正因为ItemEvent#getItem返回一个Object,所以(在这种情况下)仍然是一个String,所以item.equals仍然会调用String.equals,这就是多态的工作原理
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 2023-02-24
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多