【问题标题】:Java ComboBox how to populate on click add item not workingJava ComboBox如何在单击添加项时填充不起作用
【发布时间】:2015-07-06 03:02:07
【问题描述】:

这真的很简单。我想填充一个 jcomboBox,但只有在用户按下组合框上的箭头之后。

我认为代码是正确的,因为我在一个单独的按钮中对其进行了测试,并且它填充了组合框,但是当我为组合框本身创建一个动作侦听器时它不会填充,这里是代码。

comboBox.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            comboBox.addItem("Item");
            comboBox.addItem("Second Item");

        }

这是一个乡村城市社区的情况。我想要的是在选择第一个时填充第二个。

第一个框很容易填充(国家框)但是第二个框(城市)我为它添加了一个开关但它不会填充,我想知道是否有一个动作我应该输入我的代码让它填充?

【问题讨论】:

  • @FastSnail:你测试过这个推荐吗?我有,但在 JComboBox 本身上不起作用。
  • 哎呀我以为我会工作
  • 请根据您上面的编辑查看我的答案的编辑。

标签: java swing mouseevent actionlistener jcombobox


【解决方案1】:

我想填充一个 jcomboBox,但只有在用户按下组合框上的箭头之后。

为什么用户会看着一个空的组合框然后点击箭头?如果组合框的内容基于其他用户操作,则该操作应导致组合框被填充。

无论如何,也许您正试图在显示下拉列表时弹出组合框?

即用户可以单击组合框上的任意位置,而不仅仅是向下箭头。

在这种情况下,您可以使用PopupMenuListener

comboBox.addPopupMenuListener(new PopupMenuListener()
{
    public void popupMenuWillBecomeVisible(PopupMenuEvent e)
    {
        JComboBox comboBox = (JComboBox)e.getSource();
        comboBox.addItem("Item1");
        comboBox.addItem("Item2");
        comboBox.addItem("Item3");
        comboBox.addItem("Item4");
    }

    public void popupMenuCanceled(PopupMenuEvent e) {}
    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
});

编辑:

这是一个乡村城市社区的情况。

您的原始问题中应该包含哪些要求。正如人们所建议的那样,您的方法是错误的。子组合框应在父项更改时更新,而不是在您单击子项时更新。

请参阅How to Update Multiple Combo Boxes 以获得更好的解决方案。此处的示例仅显示了 2 个组合框,但第二个和第三个的概念相同。

【讨论】:

  • 非常感谢您的工作,问题是,每次点击都会继续添加。这是一个乡村城市邻里的情况。我想要的是在选择第一个时填充第二个,但在按下之前为空。
  • 第一个框很容易填充(国家框)但是第二个框(城市)我为它添加了一个开关但它不会填充,我想知道有没有动作我应该把我的代码放进去让它填充?再次感谢大家。
  • it just keeps on adding on each click - 代码只是一个示例而不是完整的解决方案。您可以轻松检查项目计数,并且仅在计数为 0 时添加项目。但是,这不是最佳解决方案。我编辑了答案以获得更好的解决方案,其中包含一个工作示例。
【解决方案2】:

按下 JComboBox 箭头不会触发 ActionListener。只有进行选择才会这样做,因此您的组合框需要在按下箭头之前填充。您必须重新考虑您的设计,例如在用户与其交互之前填充组合框。

如果您绝对需要为箭头按钮添加动作监听器,可以这样做,例如通过递归方法:

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class Foo extends JPanel {
   private JComboBox<String> combo = new JComboBox<>();

   public Foo() {
      add(combo);

      combo.addMouseListener(new MouseAdapter() {
         @Override
         public void mousePressed(MouseEvent e) {
            // this doesn't work!!!
            System.out.println("mouse pressed");
            super.mousePressed(e);
         }
      });
      recursiveAddAxnListener(combo);
   }

   private void recursiveAddAxnListener(Component comp) {
      if (comp instanceof AbstractButton) {
         ((AbstractButton) comp).addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
               System.out.println("added to combo's button");
            }
         });
      } else if (comp instanceof Container) {
         Component[] comps = ((Container) comp).getComponents();
         for (Component component : comps) {
            recursiveAddAxnListener(component);
         }
      }
   }

   private static void createAndShowGUI() {
      Foo paintEg = new Foo();

      JFrame frame = new JFrame("Foo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(paintEg);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

但是我推荐它吗?不,一点也不。


编辑
您已编辑您的问题并添加了:

这是一个乡村城市社区的情况。我想要的是在选择第一个时填充第二个。
第一个框很容易填充(国家框)但是第二个框(城市)我为它添加了一个开关但它不会填充,我想知道是否有一个动作我应该为它输入我的代码填充?

您可能会问一个 XY-Problem 类型的问题,当最好的解决方案是使用完全不同的方法时,您会问我如何解决 X 代码问题。在这种情况下,我强烈建议您不要在鼠标按下时填充第二个组合框,而是只填充一次,并在选择第一个组合框时执行。换句话说,在第一个组合框的 ActionListener 中填充第二个组合框。这将大大简化事情并防止不必要地重新填充第二个组合框。

【讨论】:

  • 感谢您,我正在尝试在选择第一个框时填充第二个框,但问题是每次我在第一个框中选择一个县时,它都会不断添加到第二个框(城市)。即使我添加了 combobox.removeall();在每种情况下都在开头切换。例如,如果我选择一次美国,并且我的条件是在第二个框中添加加利福尼亚,如果选择了,它会这样做,但是当我第二次选择法国时,我可以看到加利福尼亚和巴黎第二个盒子。
  • @user3195313:那么您的代码中有一个错误未显示。您将需要考虑创建和发布sscceminimal example program/mcve,在其中将代码压缩为仍可编译和运行的最小位,没有外部依赖项(例如需要链接到数据库或图像),具有没有与您的问题无关的额外代码,但仍能演示您的问题。
【解决方案3】:

谢谢大家的帮助,你们真是太棒了。

我发现我必须拥有 combobox.removeallItems();开关前不在开关内。

这是它的测试版本。它有效。

JComboBox comboBox = new JComboBox();
    comboBox.addItem("");
    comboBox.addItem("first");
    comboBox.addItem("second");
    comboBox.addItem("third");

    comboBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            comboBox_1.removeAllItems();

            String test = comboBox.getSelectedItem().toString();

            switch (test) {
            case "first":


                comboBox_1.addItem("Tesing");

                break;
            case "second":

                comboBox_1.addItem("Tesing2");

                break;
            case "third":

                comboBox_1.addItem("Tesing three");

                break;

            default:
                break;
            }

        }
    });

再次感谢所有帮助,非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2017-12-28
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多