好的,所以我有一个包含12个JCheckBox的面板,在界面加载后,所有JCheckBox都被禁用。当用户从JComboBox中选择一个选项时,我只想要启用某些JCheckBox,具体取决于在JComboBox中选择的项目。
目前在JComboBoxActionPerformed中我启用了与选择相关的所有JCheckBox,但在此之前尝试禁用当前启用的所有按钮(如果更改了JComboBox中的选定项目)。
我必须禁用任何启用按钮的代码如下:
public void disableBoxes() {
for (JCheckBox j : ArrayOfJCheckBox) {
if (j.isEnabled()) {
j.setEnabled(false);
}
}
}
这不会做任何事情,如果我从中移除对此方法的调用 然后JComboBoxActionPerformed方法启用JCheckBox,就像我期望的那样。引导我假设这个代码存在问题。
此外我正在手动创建ArrayOfJCheckBox
,我想知道是否有办法可以通过添加获取面板内的所有JCheckBox并将它们添加到列表中来实现它?如果这是可能的,那么就可以像我已经尝试的那样遍历列表吗?
感谢您的帮助!
迪恩
答案 0 :(得分:3)
你说:
好的,所以我有一个包含12个JCheckBox的面板,在加载了所有JCheckBox的界面后被禁用。当用户从JComboBox中选择一个选项时,我希望只根据JComboBox中选择的项目启用某些JCheckBox。
我们不知道您将使用什么标准来决定启用或禁用哪个JCheckBox,但目前这不是超级关键。
目前在JComboBoxActionPerformed中我启用了与选择相关的所有JCheckBox,但在此之前尝试禁用当前启用的所有按钮(如果更改了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来实现最佳服务,其中您将代码压缩到仍然编译和运行的最小位,没有外部依赖性(例如需要)链接到一个或多个数据库),没有与您的问题无关的额外代码,但仍然显示您的问题,类似于我上面的代码。