首页 > 解决方案 > JCheckBox[x] 为空?

问题描述

我只用代码创建了一个新项目,其中包含错误:

package benutzerschnittstelle;

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JCheckBox;

public class versuch extends JFrame {
  private static JPanel contentPane;
  static JCheckBox[] CheckBox;

  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          versuch frame = new versuch();
          frame.setVisible(true);

          for (int x = 0; x < 3; x++) {
            CheckBox = new JCheckBox[3];
            CheckBox[x] = new JCheckBox("Prüfungsfach");
            CheckBox[x].setBounds(180, (60 + (25 * x)), 120, 21);
            contentPane.add(CheckBox[x]);
          }

          for (int x = 0; x < 3; x++) {
            try {
              System.out.println("checkbox " + x
                      + " : " + CheckBox[x].isSelected());
            } catch (Exception e) {
              System.out.println("error at checkbox " + x
                      + " : " + e.getLocalizedMessage());
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  public versuch() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
  }
}

由于复选框在我有机会选择它们之前就被选中,因此输出应该是:

checkbox 0: false
checkbox 1: false
checkbox 2: false

但输出是:

error at checkbox 0 : Cannot invoke "javax.swing.JCheckBox.isSelected()" because "benutzerschnittstelle.versuch.CheckBoxPruefungsfach[x]" is null
error at checkbox 1 : Cannot invoke "javax.swing.JCheckBox.isSelected()" because "benutzerschnittstelle.versuch.CheckBoxPruefungsfach[x]" is null
checkbox 2 : false

如果我改变数组的长度,最后一个复选框总是按预期工作,其余的会导致错误......为什么会这样?我该如何解决?

标签: javaarraysswingjcheckbox

解决方案


在这个循环中:

for(int x = 0; x < 3; x++)
{
    CheckBox = new JCheckBox[3];
    CheckBox[x] = new JCheckBox("Prüfungsfach");
    CheckBox[x].setBounds(180, (60 + (25 * x)), 120, 21);
    contentPane.add(CheckBox[x]);
}

您正在CheckBox 循环内重新分配数组。这将覆盖当前x. 因此,在最后一次迭代中,您将索引 0 和 1 处的框重置为null.

在循环之前移动数组的初始化以解决问题。

CheckBox对于复选框es的数组来说,这也是一个相当糟糕的名称。对集合使用复数名称(按照约定,Java 中的变量名称以小写字母开头:camelCase)。


推荐阅读