Enable/Disable NetBeans 上的动态多个 JComboBox
Enable/Disable Multiple JComboBox Dynamically On NetBeans
如何通过用户输入动态设置enable/disable这么多的JCombobox?
我有多个 JComboBox
的简单设计,如下所示:
class foo{
private javax.swing.JButton jButton1;
private javax.swing.JComboBox<String> jComboBox1;
private javax.swing.JComboBox<String> jComboBox2;
private javax.swing.JComboBox<String> jComboBox3;
private javax.swing.JComboBox<String> jComboBox4;
private javax.swing.JComboBox<String> jComboBox5;
private javax.swing.JComboBox<String> jComboBox6;
private javax.swing.JComboBox<String> jComboBox7;
private javax.swing.JComboBox<String> jComboBox8;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextField1;
foo(){
jPanel1 = new javax.swing.JPanel();
jComboBox1 = new javax.swing.JComboBox<>();
jComboBox2 = new javax.swing.JComboBox<>();
jComboBox4 = new javax.swing.JComboBox<>();
jComboBox3 = new javax.swing.JComboBox<>();
jComboBox5 = new javax.swing.JComboBox<>();
jComboBox6 = new javax.swing.JComboBox<>();
jComboBox7 = new javax.swing.JComboBox<>();
jComboBox8 = new javax.swing.JComboBox<>();
jPanel2 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setLayout(new java.awt.GridLayout(8, 0));
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
jPanel1.add(jComboBox1);
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 5", "Item 6", "Item 7", "Item 8" }));
jPanel1.add(jComboBox2);
jComboBox4.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 9", "Item 10", "Item 11", "Item 12" }));
jPanel1.add(jComboBox4);
jComboBox3.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 13", "Item 14", "Item 15", "Item 16" }));
jPanel1.add(jComboBox3);
jComboBox5.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 17", "Item 18", "Item 19", "Item 20" }));
jPanel1.add(jComboBox5);
jComboBox6.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 21", "Item 22", "Item 23", "Item 24" }));
jPanel1.add(jComboBox6);
jComboBox7.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 25", "Item 26", "Item 27", "Item 28" }));
jPanel1.add(jComboBox7);
jComboBox8.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 29", "Item 30", "Item 31", "Item 32" }));
jPanel1.add(jComboBox8);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
jPanel2.setLayout(new java.awt.BorderLayout());
jPanel2.add(jTextField1, java.awt.BorderLayout.CENTER);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
// whats todo
}
});
jPanel2.add(jButton1, java.awt.BorderLayout.LINE_END);
getContentPane().add(jPanel2, java.awt.BorderLayout.PAGE_END);
pack();
}
}
所以,如何在Button
监听器上实现它如果用户类型4,combo1
到combo4
将是enabled
,另一个将是disabled
?
I have multiple combobox like this:
JComboBox combo1 = new JComboBox();
JComboBox combo2 = new JComboBox();
JComboBox combo3 = new JComboBox();
JComboBox combo4 = new JComboBox();
JComboBox combo5 = new JComboBox();
JComboBox combo6 = new JComboBox();
JComboBox combo7 = new JComboBox();
JComboBox combo8 = new JComboBox();
每当我看到名为 foo1、foo2、foo3 的变量时,我都会想,为什么编码员在这里不使用数组或 ArrayList?我问你同样的问题——你为什么要让事情变得不必要地让自己变得更难?
如果您创建了 JComboBoxes 的 ArrayList--
List<JComboBox<String>> combos = new ArrayList<>();
// code goes here to add 8 JComboBoxes to the list
然后,如果您的用户select选择了 4 并将其放入变量索引中,您可以通过以下方式轻松禁用除第 4 个 JComboBox 之外的所有内容:
// first disable all the combos
for (JComboBox<String> comboBox : combos) {
comboBox.setEnabled(false);
}
combos.get(index - 1).setEnabled(true); // enable the selected combo
我使用 index - 1
因为列表和数组是基于 0 的,而 ArrayList 中的第 4 个 JComboBox 位于索引 3。
但其他问题比比皆是:JTextFields 几乎不应该向其添加 KeyListeners,因为这会破坏其基本功能。考虑将 DocumentListener 添加到其 Document 或 DocumentFilter 或什至更好,使用 JSlider 或 JSpinner 来允许您将组件限制为仅允许可接受的输入?然后使用 ChangeListener。但更重要的是,你的设计很糟糕。为什么不简单地拥有一个 JComboBox 并在适当的事件发生时交换其数据模型?
如果您使用充满整数的 JSpinner,您可以向它添加一个更改侦听器,这将 select 为单个 JComboBox 提供适当的数据模型,并且您的代码将更简单,对用户来说更白痴证明,最重要的是,更容易调试和增强。
例如
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Foo2 extends JPanel {
private static final int MIN_VALUE = 1;
private static final int MAX_VALUE = 8;
private JSpinner spinner = new JSpinner(new SpinnerNumberModel(MIN_VALUE, MIN_VALUE, MAX_VALUE, 1));
private List<DefaultComboBoxModel<String>> models = new ArrayList<>();
private JComboBox<String> comboBox = new JComboBox<>();
public Foo2() {
for (int i = MIN_VALUE; i <= MAX_VALUE; i++) {
DefaultComboBoxModel<String> comboModel = new DefaultComboBoxModel<>();
for (int j = 0; j < 5; j++) {
String element = String.format("Selection: %d, Item: %d", i, j);
comboModel.addElement(element);
}
models.add(comboModel);
}
comboBox.setModel(models.get(0));
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int selection = (int) spinner.getValue();
comboBox.setModel(models.get(selection - 1));
}
});
add(new JLabel("Selection:"));
add(spinner);
add(new JLabel("Combo:"));
add(comboBox);
}
private static void createAndShowGui() {
Foo2 mainPanel = new Foo2();
JFrame frame = new JFrame("Foo2");
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());
}
}
如何通过用户输入动态设置enable/disable这么多的JCombobox?
我有多个 JComboBox
的简单设计,如下所示:
class foo{
private javax.swing.JButton jButton1;
private javax.swing.JComboBox<String> jComboBox1;
private javax.swing.JComboBox<String> jComboBox2;
private javax.swing.JComboBox<String> jComboBox3;
private javax.swing.JComboBox<String> jComboBox4;
private javax.swing.JComboBox<String> jComboBox5;
private javax.swing.JComboBox<String> jComboBox6;
private javax.swing.JComboBox<String> jComboBox7;
private javax.swing.JComboBox<String> jComboBox8;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField jTextField1;
foo(){
jPanel1 = new javax.swing.JPanel();
jComboBox1 = new javax.swing.JComboBox<>();
jComboBox2 = new javax.swing.JComboBox<>();
jComboBox4 = new javax.swing.JComboBox<>();
jComboBox3 = new javax.swing.JComboBox<>();
jComboBox5 = new javax.swing.JComboBox<>();
jComboBox6 = new javax.swing.JComboBox<>();
jComboBox7 = new javax.swing.JComboBox<>();
jComboBox8 = new javax.swing.JComboBox<>();
jPanel2 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation( javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setLayout(new java.awt.GridLayout(8, 0));
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
jPanel1.add(jComboBox1);
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 5", "Item 6", "Item 7", "Item 8" }));
jPanel1.add(jComboBox2);
jComboBox4.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 9", "Item 10", "Item 11", "Item 12" }));
jPanel1.add(jComboBox4);
jComboBox3.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 13", "Item 14", "Item 15", "Item 16" }));
jPanel1.add(jComboBox3);
jComboBox5.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 17", "Item 18", "Item 19", "Item 20" }));
jPanel1.add(jComboBox5);
jComboBox6.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 21", "Item 22", "Item 23", "Item 24" }));
jPanel1.add(jComboBox6);
jComboBox7.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 25", "Item 26", "Item 27", "Item 28" }));
jPanel1.add(jComboBox7);
jComboBox8.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 29", "Item 30", "Item 31", "Item 32" }));
jPanel1.add(jComboBox8);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
jPanel2.setLayout(new java.awt.BorderLayout());
jPanel2.add(jTextField1, java.awt.BorderLayout.CENTER);
jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
// whats todo
}
});
jPanel2.add(jButton1, java.awt.BorderLayout.LINE_END);
getContentPane().add(jPanel2, java.awt.BorderLayout.PAGE_END);
pack();
}
}
所以,如何在Button
监听器上实现它如果用户类型4,combo1
到combo4
将是enabled
,另一个将是disabled
?
I have multiple combobox like this:
JComboBox combo1 = new JComboBox(); JComboBox combo2 = new JComboBox(); JComboBox combo3 = new JComboBox(); JComboBox combo4 = new JComboBox(); JComboBox combo5 = new JComboBox(); JComboBox combo6 = new JComboBox(); JComboBox combo7 = new JComboBox(); JComboBox combo8 = new JComboBox();
每当我看到名为 foo1、foo2、foo3 的变量时,我都会想,为什么编码员在这里不使用数组或 ArrayList?我问你同样的问题——你为什么要让事情变得不必要地让自己变得更难?
如果您创建了 JComboBoxes 的 ArrayList--
List<JComboBox<String>> combos = new ArrayList<>();
// code goes here to add 8 JComboBoxes to the list
然后,如果您的用户select选择了 4 并将其放入变量索引中,您可以通过以下方式轻松禁用除第 4 个 JComboBox 之外的所有内容:
// first disable all the combos
for (JComboBox<String> comboBox : combos) {
comboBox.setEnabled(false);
}
combos.get(index - 1).setEnabled(true); // enable the selected combo
我使用 index - 1
因为列表和数组是基于 0 的,而 ArrayList 中的第 4 个 JComboBox 位于索引 3。
但其他问题比比皆是:JTextFields 几乎不应该向其添加 KeyListeners,因为这会破坏其基本功能。考虑将 DocumentListener 添加到其 Document 或 DocumentFilter 或什至更好,使用 JSlider 或 JSpinner 来允许您将组件限制为仅允许可接受的输入?然后使用 ChangeListener。但更重要的是,你的设计很糟糕。为什么不简单地拥有一个 JComboBox 并在适当的事件发生时交换其数据模型?
如果您使用充满整数的 JSpinner,您可以向它添加一个更改侦听器,这将 select 为单个 JComboBox 提供适当的数据模型,并且您的代码将更简单,对用户来说更白痴证明,最重要的是,更容易调试和增强。
例如
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Foo2 extends JPanel {
private static final int MIN_VALUE = 1;
private static final int MAX_VALUE = 8;
private JSpinner spinner = new JSpinner(new SpinnerNumberModel(MIN_VALUE, MIN_VALUE, MAX_VALUE, 1));
private List<DefaultComboBoxModel<String>> models = new ArrayList<>();
private JComboBox<String> comboBox = new JComboBox<>();
public Foo2() {
for (int i = MIN_VALUE; i <= MAX_VALUE; i++) {
DefaultComboBoxModel<String> comboModel = new DefaultComboBoxModel<>();
for (int j = 0; j < 5; j++) {
String element = String.format("Selection: %d, Item: %d", i, j);
comboModel.addElement(element);
}
models.add(comboModel);
}
comboBox.setModel(models.get(0));
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int selection = (int) spinner.getValue();
comboBox.setModel(models.get(selection - 1));
}
});
add(new JLabel("Selection:"));
add(spinner);
add(new JLabel("Combo:"));
add(comboBox);
}
private static void createAndShowGui() {
Foo2 mainPanel = new Foo2();
JFrame frame = new JFrame("Foo2");
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());
}
}