33

Java Swing でそれぞれチェックボックス付きの項目のリストを作成する最良の方法は何でしょうか?

つまり、それぞれテキストとチェックボックスを持つ項目を持つ JList ですか?

4

9 に答える 9

24

素晴らしい答えはこれCheckBoxListです。Telcontarの回答を実装しています(3年前ですが:)...私はJava 1.6で問題なく使用しています。私はまた、addCheckboxこのようなメソッドを追加しました (Java をしばらく使用していないので、もっと短くすることができます):

public void addCheckbox(JCheckBox checkBox) {
    ListModel currentList = this.getModel();
    JCheckBox[] newList = new JCheckBox[currentList.getSize() + 1];
    for (int i = 0; i < currentList.getSize(); i++) {
        newList[i] = (JCheckBox) currentList.getElementAt(i);
    }
    newList[newList.length - 1] = checkBox;
    setListData(newList);
}

Jidesoft のデモを試してみたところ、CheckBoxListいくつか問題が発生しました (動作がうまくいかなかった)。CheckBoxListリンク先に問題が見つかった場合は、この回答を変更します。

于 2009-12-27T15:07:23.977 に答える
16

カスタムListCellRendererを作成し、 に割り当てますJList

このカスタムは、メソッドの実装でListCellRenderera を返す必要があります。JCheckboxgetListCellRendererComponent(...)

ただし、これは編集できません。画面内の単純なペイントは、これを「チェック」する必要があるJCheckboxかどうかを選択するのはあなた次第です。JCheckbox

たとえば、行が選択されたときにチェックされていることを示します (パラメーターisSelected)。ただし、この方法では、選択が変更された場合にチェック状態が維持されません。の下のデータを参照してチェックしたことを示した方がよいのListModelですが、データのチェック状態を変更し、変更を に通知して再描画するメソッドを実装するのはあなた次第ですJList

必要に応じてサンプルコードを後で投稿します

ListCellRenderer

于 2008-08-21T13:05:26.637 に答える
13

実装するだけListCellRenderer

public class CheckboxListCellRenderer extends JCheckBox implements ListCellRenderer {

    public Component getListCellRendererComponent(JList list, Object value, int index, 
            boolean isSelected, boolean cellHasFocus) {

        setComponentOrientation(list.getComponentOrientation());
        setFont(list.getFont());
        setBackground(list.getBackground());
        setForeground(list.getForeground());
        setSelected(isSelected);
        setEnabled(list.isEnabled());

        setText(value == null ? "" : value.toString());  

        return this;
    }
}

レンダラーを設定します

JList list = new JList();
list.setCellRenderer(new CheckboxListCellRenderer());

これにより、

CheckboxListCellRenderer の例

詳細については、カスタム swing コンポーネント レンダラーを参照してください。

PS: 無線要素が必要な場合は、 に置き換えextends JCheckboxextends JRadioButtonください。

于 2014-11-30T17:16:32.220 に答える
11

私はおそらくJListではなくJTableを使用することを検討しているでしょう。また、チェックボックスのデフォルトのレンダリングはかなり見苦しいので、ブール値を表すためにカスタムのTableModelCellRenderer、およびCellEditorをドロップすることを検討しているでしょう。もちろん、これはすでに何億回も行われていると思います。Sun には良い例があります。

于 2008-08-21T13:04:02.490 に答える
8

Java 7 以降のより良いソリューション

私はこの質問に出くわし、いくつかの回答がかなり古くて時代遅れであることに気付きました. 現在、JList は一般的なものであるため、より優れたソリューションがあります。

一般的な JCheckBoxList の私の解決策:

import java.awt.Component;

import javax.swing.*;
import javax.swing.border.*;

import java.awt.event.*;

@SuppressWarnings("serial")
public class JCheckBoxList extends JList<JCheckBox> {
  protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

  public JCheckBoxList() {
    setCellRenderer(new CellRenderer());
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) {
        int index = locationToIndex(e.getPoint());
        if (index != -1) {
          JCheckBox checkbox = (JCheckBox) getModel().getElementAt(index);
          checkbox.setSelected(!checkbox.isSelected());
          repaint();
        }
      }
    });
    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  public JCheckBoxList(ListModel<JCheckBox> model){
    this();
    setModel(model);
  }

  protected class CellRenderer implements ListCellRenderer<JCheckBox> {
    public Component getListCellRendererComponent(
        JList<? extends JCheckBox> list, JCheckBox value, int index,
        boolean isSelected, boolean cellHasFocus) {
      JCheckBox checkbox = value;

      //Drawing checkbox, change the appearance here
      checkbox.setBackground(isSelected ? getSelectionBackground()
          : getBackground());
      checkbox.setForeground(isSelected ? getSelectionForeground()
          : getForeground());
      checkbox.setEnabled(isEnabled());
      checkbox.setFont(getFont());
      checkbox.setFocusPainted(false);
      checkbox.setBorderPainted(true);
      checkbox.setBorder(isSelected ? UIManager
          .getBorder("List.focusCellHighlightBorder") : noFocusBorder);
      return checkbox;
    }
  }
}

JCheckBox リストを動的に追加するには、独自の ListModel を作成するか、DefaultListModel を追加する必要があります。

DefaultListModel<JCheckBox> model = new DefaultListModel<JCheckBox>();
JCheckBoxList checkBoxList = new JCheckBoxList(model);

DefaultListModelはジェネリックであるため、JAVA 7 API で指定されたメソッドを次のように使用できます

model.addElement(new JCheckBox("Checkbox1"));
model.addElement(new JCheckBox("Checkbox2"));
model.addElement(new JCheckBox("Checkbox3"));
于 2014-07-16T09:53:32.357 に答える
3

誰かがあなたが必要とするウィジェットやユーティリティをすでに実装している可能性は Java で十分です。大規模な OSS コミュニティの利点の一部。本当に自分でやりたい場合を除き、車輪を再発明する必要はありません。この場合、CellRenderers と Editors の学習に適しています。

私のプロジェクトは JIDE で大成功を収めました。必要なコンポーネントであるチェック ボックス リストは、JIDE Common Layer (OSS であり、java.net でホストされています) にあります。商業的なものも良いですが、あなたはそれを必要としません.

http://www.jidesoft.com/products/oss.htm https://jide-oss.dev.java.net/

于 2008-08-21T13:18:40.130 に答える
0

これは、Rawa による JCheckBoxList へのほんの少しの追加です。これにより、スペースバーを使用して選択する機能が追加されます。複数のアイテムを選択した場合、すべて最初のアイテムの反転値に設定されます。

        addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            int index = getSelectedIndex();
            if (index != -1 && e.getKeyCode() == KeyEvent.VK_SPACE) {
                boolean newVal = !((JCheckBox) (getModel()
                        .getElementAt(index))).isSelected();
                for (int i : getSelectedIndices()) {
                    JCheckBox checkbox = (JCheckBox) getModel()
                            .getElementAt(i);
                    checkbox.setSelected(newVal);
                    repaint();
                }
            }
        }
        });
于 2014-08-27T07:13:46.227 に答える