JCheckBoxとStringを含むJListで、ctrl以外のクリック選択がありますか?
質問
ここに投稿してからしばらく経ちましたが、今はまた立ち往生しています。
uniでの課題のために、アドレス帳アプリケーションを作成するように求められました。それは順調に進んでおり、ほぼ完成していますが、プロジェクトの一部(純粋に私の好みです)から私を逃れます。明確にするために、私が採点する課題のどの部分についても助けを求めていません。誰かがその証拠を希望する場合は、仕様をアップロードできます。 (/開示)
アプリケーションの一部は、カスタムファイルタイプおよびvcard形式からインポートおよびエクスポートしています。これは正常に機能します。カスタムファイルタイプは複数の連絡先を保持し、連絡先ごとに4行のみです。複数の連絡先を保持しているため、新しいウィンドウが開き、ファイルにエクスポートする連絡先を選択するように求められます。これには、ユーザーが連絡先を選択してファイルをエクスポートできるJListが含まれています。
私がやろうとしているのは、JListのチェックボックスを使用できるカスタムセルレンダラーを作成することです。私はここを見て、これがほとんど機能するようになりました( http:/ /java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer )およびこちら( http://www.jroller.com/santhosh/entry/jlist_with_checkboxes )、しかし運はありません。最初のリンクはカスタムセルレンダラーの作成方法を説明していますが、チェックボックスは説明していません。2番目のリンクはチェックボックスの作成方法を説明しています。表示するチェックボックスを取得できますが、表示されるのはそれだけです。
後者の例では、リストのメンバーを選択するためにボックス自体をクリックする必要があります。私ができるようにしたいのは、ユーザーがリスト項目またはチェックボックスをクリックして項目を選択できるようにすることです。
作業したばかりのチェックボックスのバージョンでは、選択は機能していましたが、複数のアイテムを選択するにはctrlを押し続ける必要がありました。アイテムの複数選択にctrlが必要ないようにする方法はありますか?クリックで修飾子を読み取ることができることは知っていますが、指定したオブジェクトのクリックに修飾子を適用できるかどうかはわかりません。
ご意見、コメント、提案、リンク、正確な回答はすべて大歓迎です! :)
解決
これはそれを行います。ただし、チェックボックスは実際には何もしないため、基本的に偽造されていますが、チェックするとリスト項目が選択されます。
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
public class Relequestual extends JFrame {
private final FunkyCellRendererComponent funkyCRC = new FunkyCellRendererComponent();
public Relequestual() {
getContentPane().setLayout(new FlowLayout());
String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" };
JList theList = new JList(items);
theList.setCellRenderer(
new ListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
funkyCRC.setup(list, value, index, isSelected, cellHasFocus);
return funkyCRC;
}
});
getContentPane().add(theList);
}
/**
* @param args
*/
public static void main(String[] args) {
Relequestual gui = new Relequestual();
gui.pack();
gui.setVisible(true);
}
class FunkyCellRendererComponent extends JPanel {
private JCheckBox checkBox = new JCheckBox();
private JLabel label = new JLabel();
private JList list;
private int index;
public FunkyCellRendererComponent() {
super(null);
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add(this.checkBox);
add(this.label);
}
public void setup(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
this.list = list;
this.index = index;
this.label.setText((String) list.getModel().getElementAt(index));
if (isSelected) {
setForeground(list.getSelectionForeground());
setBackground(list.getSelectionBackground());
} else {
setForeground(list.getForeground());
setBackground(list.getBackground());
}
this.checkBox.setSelected(isSelected);
}
}
}
他のヒント
JTableを使用して、チェックボックスを別の列として追加します。
その後、テーブルにMouseListenerを追加し、他の列がチェックされるたびにチェックボックスの値を切り替えます。