【问题标题】:JCheckBoxes not being disabled after I setEnable(false) them在我 setEnable(false) 之后,JCheckBoxes 没有被禁用
【发布时间】:2015-06-18 23:14:14
【问题描述】:

如果有 30 个复选框并且我不希望选中超过 6 个。我有一个 int 跟踪检查了多少。每个盒子都有一个项目侦听器,它调用一个方法来查看该 int 的位置,如果它达到 6,则该方法在每个盒子上调用 setEnabled(false)。 但是,即使在 int number_of_boxes_checked 达到 6 之后,这些框也不会被禁用。

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JCheckBox;
import java.awt.GridLayout;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JLabel;

public class JLottery2 extends JFrame {

private JPanel contentPane;
int number_of_boxes_checked = 1;
JCheckBox[] checkBox = new JCheckBox[30];
JLabel label = new JLabel("0");

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                JLottery2 frame = new JLottery2();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public JLottery2() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 586, 360);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JPanel panel = new JPanel();
    panel.setBounds(10, 11, 321, 299);
    contentPane.add(panel);
    panel.setLayout(new GridLayout(5, 6, 0, 0));

    JPanel panel_1 = new JPanel();
    panel_1.setBounds(330, 11, 230, 299);
    contentPane.add(panel_1);

    panel_1.add(label);

    for (int i = 0; i < 30; ++i) {
        checkBox[i] = new JCheckBox(Integer.toString(i + 1));
        panel.add(checkBox[i]);
    }
    for (int i = 0; i < 30; ++i) {
        checkBox[i].addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                limit_checkBoxes();
            }
        });
    }
}

public void limit_checkBoxes() {
    label.setText(Integer.toString(number_of_boxes_checked));
    if (number_of_boxes_checked > 6) {
        for (int i = 0; i > 30; ++i) {
            checkBox[i].setEnabled(false);
        }
    } else {
        ++number_of_boxes_checked;

    }
}
}

【问题讨论】:

  • 虽然空布局和setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整您的组件大小,它们是增强或维护的皇家女巫,放置在滚动窗格中时它们完全失败,在与原始不同的所有平台或屏幕分辨率上查看时它们看起来很糟糕.
  • 作为 OP 的旁注,checkBox[i].setEnabled(false); 行不是很友好。选中第 6 个框后,用户如何改变主意?他们都会被禁用。也许只用checkBox[i].setEnabled(checkbox[i].isSelected()) 禁用剩余的未选中框。然后,您必须在 else 块中添加代码,以确保在计数小于最大值时启用所有代码。

标签: java swing checkbox jframe enable-if


【解决方案1】:

在您的limit_checkBoxes() 方法中,您希望i &lt; 30,而不是i &gt; 30 在循环中。查看我嵌入的评论。

    label.setText(Integer.toString(number_of_boxes_checked));
    if (number_of_boxes_checked > 6) {
        for (int i = 0; i < 30; ++i) { //<- your bug was here, I fixed it
            checkBox[i].setEnabled(false);
        }
    } else {
        ++number_of_boxes_checked;
   }

【讨论】:

  • 谢谢你,我不敢相信我犯了这么容易的错误。
  • 附带说明一下,当我在您的幻数 (6) 周围设置断点时,我只需在调试器中单步执行代码即可快速识别问题
【解决方案2】:

换行:for (int i = 0; i &gt; 30; ++i) { 用这个for (int i = 0; i &lt; 30; i++) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多