【问题标题】:How to use comboBox variable outside of class or take variable inside of comboBox method如何在类外使用组合框变量或在组合框方法内获取变量
【发布时间】:2026-02-04 20:00:01
【问题描述】:

我在 java-eclipse 中编码并尝试使用组合框获取值,但这些值在其他要使用的函数中不可见。每当我尝试将类移动到声明组合框的类内部时,函数变量就会变得不可见。 这是一步一步的问题; 1. 这是我想使用组合框值的方法;

public void ata(int P1_x, int P1_y, int P2_x, int P2_y, String P1_direction, String P2_direction,int array[][],int array1[][])
{  
        if(P1_direction=="Horizontal")
        {
            gemiatadikey(P1_x,P1_y,array);
        }
        else
        {
            gemiatayatay(P1_x,P1_y,array);
        }
        if(P2_direction == "Horizontal")
        {
            gemiatadikey(P2_x, P2_y,array1);
        }
        else
            gemiatayatay(P2_x, P2_y,array1);

起初我自己初始化值并且它正在工作,但后来我需要通过使用面板上的任何东西从用户那里获取这些值,因为我对 JFrame 和 Panels 没有经验,所以除了使用之外我找不到任何东西组合框。从 WindowBuilder 的设计部​​分,我添加了组合框并在中添加了一些选择。然后将一些代码添加到我的项目中,我尝试使用此代码获取值;

public void actionPerformed(ActionEvent e) {
            JComboBox comboBox = new JComboBox();
            comboBox.setModel(new DefaultComboBoxModel(new String[] {"Horizontal", "Vertical"}));
            String P1_direction = comboBox.getSelectedItem().toString();

            JComboBox comboBox_1 = new JComboBox();
            comboBox_1.setModel(new DefaultComboBoxModel(new String[] {"Horizontal", "Vertical"}));
            String P2_direction = comboBox_1.getSelectedItem().toString();

            JComboBox comboBox_2 = new JComboBox();
            comboBox_2.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
            String P1_x = comboBox_2.getSelectedItem().toString();
            int P1_coordinate_x = Integer.parseInt(P1_x);

            JComboBox comboBox_3 = new JComboBox();
            comboBox_3.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
            String P1_y = comboBox_3.getSelectedItem().toString();
            int P1_coordinate_y = Integer.parseInt(P1_y);

            JComboBox comboBox_4 = new JComboBox();
            comboBox_4.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
            String P2_x = comboBox_4.getSelectedItem().toString();
            int P2_coordinate_x = Integer.parseInt(P2_x);

            JComboBox comboBox_5 = new JComboBox();
            comboBox_5.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
            String P2_y = comboBox_5.getSelectedItem().toString();
            int P2_coordinate_y = Integer.parseInt(P2_y);

        }
    });

然后我尝试将我的“ata”方法称为;

  ata(P1_coordinate_x, P1_coordinate_y, P2_coordinate_x, P2_coordinate_y, P1_direction, P2_direction, gemiOlanArray, gemiOlanArray1);

但它不起作用,因为这个声明没有看到(或得到) P1_coordinate_x ,......等等......我很确定我做错了什么,但我不熟悉这些概念所以怎么能我处理这个?谢谢

【问题讨论】:

  • 我认为您不应该在每次更改时都创建一个新的ComboBoxModel
  • 我如何编辑这段代码,从你的角度来看,我似乎不理解这个组合框的概念。您能提出一些正确使用它的建议吗?
  • @user2962529:如果我能更好地理解您的问题,我可以提出更多建议。我建议你花更多的精力来提出一个更好的问题。稍加努力就可以获得更好的答案。
  • 希望这个版本更清晰,抱歉第一次提问不佳。

标签: java swing methods combobox frame


【解决方案1】:

不幸的是,您当前发布的代码毫无意义:

public void actionPerformed(ActionEvent e) {
  JComboBox comboBox = new JComboBox();
  comboBox.setModel(new DefaultComboBoxModel(new String[] {"Horizontal", "Vertical"}));
  String P1_direction = comboBox.getSelectedItem().toString();

您正在创建一个新的 JComboBox,没有在任何地方显示它,并在任何用户有机会对其进行任何操作之前立即从中提取选择,这将永远无法工作。

建议:

  • 不要在任何地方“移动组合框”。将它们保存在它们所属的 GUI 中。
  • 确保您的 JComboBox 被声明为实例字段,并且未在方法或构造函数内部声明,根据范围规则,它们仅在声明它们的范围内可见。
  • 如果您需要外部类能够检查 JComboBoxes 的状态,则为持有并显示它们的类提供公共方法,这些方法返回当前选定的项目或感兴趣的组合的索引。
  • 如需更具体的帮助,请考虑告诉我们更多关于您的问题并显示更多相关代码,最好是sscce

例如,

我正在...尝试使用组合框获取值,但这些值在其他要使用的函数中不可见。

对什么不可见?在哪里?您是否将 JComboBoxes 声明为类字段(您应该)或者它们是某些方法或构造函数的本地字段?

每当我尝试将类移动到声明组合框的类内部时,函数变量就会变得不可见。


编辑

关于你最新发布的代码,这注定要失败:

public void actionPerformed(ActionEvent e) {
        JComboBox comboBox = new JComboBox();
        comboBox.setModel(new DefaultComboBoxModel(new String[] {"Horizontal", "Vertical"}));
        String P1_direction = comboBox.getSelectedItem().toString();

        JComboBox comboBox_1 = new JComboBox();
        comboBox_1.setModel(new DefaultComboBoxModel(new String[] {"Horizontal", "Vertical"}));
        String P2_direction = comboBox_1.getSelectedItem().toString();

        JComboBox comboBox_2 = new JComboBox();
        comboBox_2.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
        String P1_x = comboBox_2.getSelectedItem().toString();
        int P1_coordinate_x = Integer.parseInt(P1_x);

        JComboBox comboBox_3 = new JComboBox();
        comboBox_3.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
        String P1_y = comboBox_3.getSelectedItem().toString();
        int P1_coordinate_y = Integer.parseInt(P1_y);

        JComboBox comboBox_4 = new JComboBox();
        comboBox_4.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
        String P2_x = comboBox_4.getSelectedItem().toString();
        int P2_coordinate_x = Integer.parseInt(P2_x);

        JComboBox comboBox_5 = new JComboBox();
        comboBox_5.setModel(new DefaultComboBoxModel(new String[] {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}));
        String P2_y = comboBox_5.getSelectedItem().toString();
        int P2_coordinate_y = Integer.parseInt(P2_y);

    }
});

如上所述,您正在创建从不显示在 GUI 上的 JComboBox,并尝试从用户有机会与它们交互之前提取信息,即使它们显示在 GUI 中也是如此。这些错误中的任何一个都足以使代码失败。

这段代码也有错误:

public void ata(int P1_x, int P1_y, int P2_x, int P2_y, String P1_direction, String P2_direction,int array[][],int array1[][])
{  
        if(P1_direction=="Horizontal")
        {
            gemiatadikey(P1_x,P1_y,array);
        }

因为您使用== 来比较字符串而不是equals(...) 方法。 == 比较一个对象是否与另一个对象相同,这不是您想知道的。您想知道Strings是否具有相同的信息,相同的字符顺序相同,因此需要使用equals(...)equalsIgnoreCase(...)方法。

还有太多您没有向我们展示的内容,例如您声明和显示 JComboBoxes 的位置。 再次您是在类中声明它们(是的,这样做!)还是在方法或构造函数中(不,不要这样做!)?您是尝试从一个类还是从一个单独的类访问 JComboBoxes?请考虑按照上述要求发布 SSCCE。请澄清。

顺便说一句,在您了解所使用的库之前,您应该避免使用 Window-Builder,因为使用它可以让您不必了解该库的许多细微差别。现在要手动编写 Swing GUI,请参阅 Swing 教程和 Java API。

【讨论】:

  • 我编辑了我的问题,抱歉我的英语不好,如果不清楚请告诉我,我会尽力提供更多信息。由于整个项目包含一千多个代码,我无法不要在这里复制它们。
  • @user2962529:请参阅上面回答的编辑。不,不要显示所有程序的代码,但希望你有可以向我们展示的合理大小的类。如果您可以创建并发布一个,我们更喜欢sscce