根据JComboBox.SelectedItem

时间:2015-07-23 19:25:44

标签: java swing awt

好的,所以我有一个包含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并将它们添加到列表中来实现它?如果这是可能的,那么就可以像我已经尝试的那样遍历列表吗?

感谢您的帮助!

迪恩

1 个答案:

答案 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来实现最佳服务,其中您将代码压缩到仍然编译和运行的最小位,没有外部依赖性(例如需要)链接到一个或多个数据库),没有与您的问题无关的额外代码,但仍然显示您的问题,类似于我上面的代码。