[更新数组后更新JcomboBox

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[更新数组后更新JcomboBox相关的知识,希望对你有一定的参考价值。

我有一个JComboBox,它显示主类中数组的内容,但是我还有另一个类,该类具有根据用户输入更改数组的功能。但是,即使数组在主类中已更新,JComboBox也不会更新(我使用打印检查其是否确实已更新)。当将更多项目添加到数组或从数组中删除项目时,JComboBox是否可以更新?

这是主类中的JComboBox,其中buildingNames是存储信息的数组,将被更新。

private String[] buildingNames;

public mainWindow() {
    initialize();
}

private void initialize() {
    frame = new JFrame("Main Window");
    frame.setBounds(0, 0, 1280, 720);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);
    frame.setBackground(Color.WHITE);
    frame.setResizable(false);

    buildingNames = {"Costlemark","Science","Research"} //This will get updated

    DefaultComboBoxModel BuildingModel = new DefaultComboBoxModel(buildingNames);
    JComboBox selectBuilding = new JComboBox(BuildingModel);
    selectBuilding.setBounds(46, 82, 150, 40);
    frame.getContentPane().add(selectBuilding);
}
答案

存在几种解决方案,包括:

  • 使用观察者模式在数组更新时通知相关对象,然后为组合框创建一个新模型,并在更新发生时将其加载到组合中。这将是更大的Model-View-Controller程序结构的一部分,可能是我要采用的方法。
  • 创建您自己的模型类,扩展抽象的组合框模型类,一种使用数组本身,而另一种在更改数组时得到通知。
  • 完全摆脱数组,而在需要的位置和时间更新组合框模型

任何解决方案的细节,包括代码,将取决于您当前程序的细节。

建议:

  • 您的组合框变量应notinitialize()方法中局部声明,因为这将使其对其余的类不可见,也不应将任何其他对象分配给需要通过程序更改其状态。将变量声明为类的私有实例字段。
  • 不要设置组件的边界或使用空布局,而要设置属性(可见行数,原型显示值...)并允许组件自行调整大小。
  • 如果数组的内容在程序ru期间可能发生很大变化,那么您可能应该使用自定义Building类的集合,例如ArrayList<String>,甚至更好的是ArrayList<Building>

关于最后一个建议的示例,我们只使用组合框模型:

import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class BuildingTest extends JPanel {
    private DefaultComboBoxModel<String> comboModel = new DefaultComboBoxModel<>(new String[] {"Foo", "Bar", "Baz"});
    private JComboBox<String> selectBuildingCombo = new JComboBox<>(comboModel);
    private JTextField entryField = new JTextField(10);
    private JButton enterBuildingBtn = new JButton("Enter Building Name");    

    public BuildingTest() {
        selectBuildingCombo.setPrototypeDisplayValue("abcdefghijklmnopqrstuv");
        add(selectBuildingCombo);
        add(new JLabel("Enter new building name:"));
        add(entryField);
        add(enterBuildingBtn);

        selectBuildingCombo.addActionListener(e -> {
            String selection = (String) selectBuildingCombo.getSelectedItem();
            if (selection != null) {
                System.out.println("Selected Item: " + selection);
            }
        });

        ActionListener enterBuildingListener = e -> {
            String text = entryField.getText().trim();
            if (!text.isEmpty()) {
                comboModel.addElement(text);
                entryField.selectAll();
            }
        };
        enterBuildingBtn.addActionListener(enterBuildingListener);
        entryField.addActionListener(enterBuildingListener);
        enterBuildingBtn.setMnemonic(KeyEvent.VK_E);
    }

    private static void createAndShowGui() {
        BuildingTest mainPanel = new BuildingTest();

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

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

以上是关于[更新数组后更新JcomboBox的主要内容,如果未能解决你的问题,请参考以下文章

更新 JComboBox

JCOMBOBOX 内的重复值

如何从 Document Listener 更新 JComboBox 的列表?

如何从 ArrayList 更新 JComboBox 内容?

当数据库中的表在java中更新时如何立即更新jcombobox

GMSMarker 信息窗口内容(片段)未更新