OK,所以我有一个包含12个JCheckBox的面板,在接口加载后,所有JCheckBox都被禁用了。当用户从JComboBox选择一个选项时,我只希望根据JComboBox中选择的项目启用某些JCheckBox。
目前,在JComboBoxActionPerformed中,我正在启用与选择相关的所有JCheckBoxes,但在此之前,尝试禁用当前启用的所有按钮(以防JComboBox中的选定项被更改)。
我必须禁用任何启用的按钮的代码如下:
public void disableBoxes() {
for (JCheckBox j : ArrayOfJCheckBox) {
if (j.isEnabled()) {
j.setEnabled(false);
}
}
}
但是,这不会做任何事情,如果我从
JComboBoxActionPerformed方法,然后按我期望的那样启用JCheckBox。让我假设问题出在此代码。
此外,我当前正在手动创建
ArrayOfJCheckBox
,我想知道是否可以通过添加面板中所有JCheckBox的内部并将它们添加到列表中来做到这一点?如果可能的话,是否有可能像我已经尝试过的那样遍历列表?谢谢你的帮助!
院长
最佳答案
您声明:
OK,所以我有一个包含12个JCheckBox的面板,在接口加载后,所有JCheckBox都被禁用了。当用户从JComboBox选择一个选项时,我只希望根据JComboBox中选择的项目启用某些JCheckBox。
我们不知道您将使用什么标准来决定启用或禁用哪个JCheckBox,但这暂时并不重要。
目前,在JComboBoxActionPerformed中,我正在启用与选择相关的所有JCheckBoxes,但在此之前,尝试禁用当前启用的所有按钮(以防JComboBox中的选定项被更改)。
这应该工作。
我必须禁用任何启用的按钮的代码如下:
public void disableBoxes() {
for (JCheckBox j : ArrayOfJCheckBox) {
if (j.isEnabled()) {
j.setEnabled(false);
}
}
}
但是,这没有做任何事情。如果我从JComboBoxActionPerformed方法中删除对此方法的调用,那么JCheckBox的启用就如我所期望的那样。让我假设问题出在此代码。
这应该有效,但是您的帖子并未向我们显示它为何不起作用,因此,鉴于所提供的信息,我们无法帮助解决其仍无法起作用的具体原因。
此外,我目前正在手动创建ArrayOfJCheckBox,我想知道是否有一种方法可以通过将所有JCheckBox放入面板中并将它们添加到列表中来实现?如果可能的话
由于我们不知道您是如何手动创建“ ArrayOfJCheckBox”的,因此无法很好地解决您的问题,因为您没有发布代码,也无法帮助您处理第二个请求,因为我们不知道您的程序的结构。
综上所述,创建JCheckBox或JToggleButton的列表(父类)应该很容易,然后在需要时遍历该列表以启用和禁用组件。
例如:
import java.awt.BorderLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
@SuppressWarnings("serial")
public class CheckBoxList extends JPanel {
private static final int CHECK_BOX_COUNT = 12; // number of JCheckBoxes
private List<JCheckBox> checkBoxList = new ArrayList<>(); // list of JCheckBoxes
private DefaultComboBoxModel<Integer> cModel = new DefaultComboBoxModel<>(); // combo box model
private JComboBox<Integer> comboBox = new JComboBox<>(cModel);
public CheckBoxList() {
// create JPanel to hold JCheckBoxes
JPanel checkBoxPanel = new JPanel(new GridLayout(0, 1, 0, 5));
// create JCheckBoxes and add to both the above JPanel and the checkBoxList
for (int i = 0; i < CHECK_BOX_COUNT; i++) {
String text = "CheckBox " + i;
JCheckBox checkBox = new JCheckBox(text);
checkBox.setEnabled(false); // disabled by default
checkBoxPanel.add(checkBox);
checkBoxList.add(checkBox);
}
// fill our combo box's model. For this example, I'm just going to use
// Integers, and then enable only the JCheckBoxes that are multiples of the selected int
for (int i = 0; i < 5; i++) {
cModel.addElement(i + 1);
}
comboBox.setSelectedIndex(-1); // set combo at empty
comboBox.addActionListener(new ComboListener()); // add ActionListner
// JPanel to hold the JComboBox
JPanel centerPanel = new JPanel(new GridBagLayout());
centerPanel.add(comboBox);
int gap = 35;
centerPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
// add all to the main JPanel (this)
gap = 5;
setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
setLayout(new BorderLayout());
add(centerPanel, BorderLayout.CENTER);
add(checkBoxPanel, BorderLayout.LINE_END);
}
private class ComboListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// get combo's selection
int selection = (Integer) comboBox.getSelectedItem();
// use the information to enable/disable JCheckBoxes
for (int i = 0; i < checkBoxList.size(); i++) {
if (i % selection == 0) {
checkBoxList.get(i).setEnabled(true);
} else {
checkBoxList.get(i).setEnabled(false);
}
}
}
}
// create and display GUI
private static void createAndShowGui() {
CheckBoxList mainPanel = new CheckBoxList();
JFrame frame = new JFrame("CheckBoxList");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
再说一次,如果这样做没有帮助,那么最好通过创建并发布一个Minimal, Complete, and Verifiable Example Program来为您提供最佳服务,您可以在其中将代码压缩为仍然可以编译和运行的最小位,并且没有外部依赖项(例如,需要链接到数据库)或图片),没有与您的问题无关的多余代码,但仍然可以证明您的问题,类似于上面的代码。
关于java - 启用和禁用JCheckBox取决于JComboBox.SelectedItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31596382/