Java Swing でそれぞれチェックボックス付きの項目のリストを作成する最良の方法は何でしょうか?
つまり、それぞれテキストとチェックボックスを持つ項目を持つ JList ですか?
素晴らしい答えはこれ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
リンク先に問題が見つかった場合は、この回答を変更します。
カスタムListCellRenderer
を作成し、 に割り当てますJList
。
このカスタムは、メソッドの実装でListCellRenderer
a を返す必要があります。JCheckbox
getListCellRendererComponent(...)
ただし、これは編集できません。画面内の単純なペイントは、これを「チェック」する必要があるJCheckbox
かどうかを選択するのはあなた次第です。JCheckbox
たとえば、行が選択されたときにチェックされていることを示します (パラメーターisSelected
)。ただし、この方法では、選択が変更された場合にチェック状態が維持されません。の下のデータを参照してチェックしたことを示した方がよいのListModel
ですが、データのチェック状態を変更し、変更を に通知して再描画するメソッドを実装するのはあなた次第ですJList
。
必要に応じてサンプルコードを後で投稿します
実装するだけ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());
これにより、
詳細については、カスタム swing コンポーネント レンダラーを参照してください。
PS: 無線要素が必要な場合は、 に置き換えextends JCheckbox
てextends JRadioButton
ください。
私はおそらくJListではなくJTableを使用することを検討しているでしょう。また、チェックボックスのデフォルトのレンダリングはかなり見苦しいので、ブール値を表すためにカスタムのTableModel、CellRenderer、およびCellEditorをドロップすることを検討しているでしょう。もちろん、これはすでに何億回も行われていると思います。Sun には良い例があります。
私はこの質問に出くわし、いくつかの回答がかなり古くて時代遅れであることに気付きました. 現在、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"));
誰かがあなたが必要とするウィジェットやユーティリティをすでに実装している可能性は Java で十分です。大規模な OSS コミュニティの利点の一部。本当に自分でやりたい場合を除き、車輪を再発明する必要はありません。この場合、CellRenderers と Editors の学習に適しています。
私のプロジェクトは JIDE で大成功を収めました。必要なコンポーネントであるチェック ボックス リストは、JIDE Common Layer (OSS であり、java.net でホストされています) にあります。商業的なものも良いですが、あなたはそれを必要としません.
http://www.jidesoft.com/products/oss.htm https://jide-oss.dev.java.net/
これは、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();
}
}
}
});