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/

10-11 05:05