ウィザードの一部としてJListを使用して、実行するすべてのステップを表示します(これにはステップをクリックすることもできます)。前の手順で行ったことに基づいて、いくつかのステップは必ずしも必要ではありません。私がリストで無効にしたいのは、これらの適用不可能な手順です。JList内のアイテムを無効にする
リストの特定のアイテムを無効にする(選択を禁止する)方法はありますか? JListをサブクラス化し、すべての選択関連メソッドをオーバーライドするよりも良い方法はありますか?
ウィザードの一部としてJListを使用して、実行するすべてのステップを表示します(これにはステップをクリックすることもできます)。前の手順で行ったことに基づいて、いくつかのステップは必ずしも必要ではありません。私がリストで無効にしたいのは、これらの適用不可能な手順です。JList内のアイテムを無効にする
リストの特定のアイテムを無効にする(選択を禁止する)方法はありますか? JListをサブクラス化し、すべての選択関連メソッドをオーバーライドするよりも良い方法はありますか?
ISENABLEDか
簡単な例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class JListDisabledItemDemo implements ItemListener, Runnable {
private JFrame f = new JFrame("Colors");
private static final String ITEMS[] = {" black ", " blue ", " green ",
" orange ", " purple ", " red ", " white ", " yellow "};
private JList jList;
private JCheckBox[] checkBoxes;
private boolean[] enabledFlags;
@Override
public void run() {
JPanel pnlEnablers = new JPanel(new GridLayout(0, 1));
pnlEnablers.setBorder(BorderFactory.createTitledBorder("Enabled Items"));
checkBoxes = new JCheckBox[ITEMS.length];
enabledFlags = new boolean[ITEMS.length];
for (int i = 0; i < ITEMS.length; i++) {
checkBoxes[i] = new JCheckBox(ITEMS[i]);
checkBoxes[i].setSelected(true);
checkBoxes[i].addItemListener(this);
enabledFlags[i] = true;
pnlEnablers.add(checkBoxes[i]);
}
jList = new JList(ITEMS);
jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jList.setSelectionModel(new DisabledItemSelectionModel());
jList.setCellRenderer(new DisabledItemListCellRenderer());
jList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
System.out.println("selection");
}
}
});
JScrollPane scroll = new JScrollPane(jList);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
Container contentPane = f.getContentPane();
contentPane.setLayout(new GridLayout(1, 2));
contentPane.add(pnlEnablers);
contentPane.add(scroll);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocation(240, 280);
UIManager.put("List.background", Color.lightGray);
UIManager.put("List.selectionBackground", Color.orange);
UIManager.put("List.selectionForeground", Color.blue);
UIManager.put("Label.disabledForeground", Color.magenta);
SwingUtilities.updateComponentTreeUI(f);
f.pack();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
f.setVisible(true);
}
});
}
@Override
public void itemStateChanged(ItemEvent event) {
JCheckBox checkBox = (JCheckBox) event.getSource();
int index = -1;
for (int i = 0; i < ITEMS.length; i++) {
if (ITEMS[i].equals(checkBox.getText())) {
index = i;
break;
}
}
if (index != -1) {
enabledFlags[index] = checkBox.isSelected();
jList.repaint();
}
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new JListDisabledItemDemo());
}
private class DisabledItemListCellRenderer extends DefaultListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component comp = super.getListCellRendererComponent(list, value, index, false, false);
JComponent jc = (JComponent) comp;
if (enabledFlags[index]) {
if (isSelected & cellHasFocus) {
comp.setForeground(Color.black);
comp.setBackground(Color.red);
} else {
comp.setForeground(Color.blue);
}
if (!isSelected) {
if ((value.toString()).trim().equals("yellow")) {
comp.setForeground(Color.orange);
comp.setBackground(Color.magenta);
}
}
return comp;
}
comp.setEnabled(false);
return comp;
}
}
private class DisabledItemSelectionModel extends DefaultListSelectionModel {
private static final long serialVersionUID = 1L;
@Override
public void setSelectionInterval(int index0, int index1) {
if (enabledFlags[index0]) {
super.setSelectionInterval(index0, index0);
} else {
/*
* The previously selected index is before this one,
* so walk forward to find the next selectable item.
*/
if (getAnchorSelectionIndex() < index0) {
for (int i = index0; i < enabledFlags.length; i++) {
if (enabledFlags[i]) {
super.setSelectionInterval(i, i);
return;
}
}
} /*
* Otherwise, walk backward to find the next selectable item.
*/ else {
for (int i = index0; i >= 0; i--) {
if (enabledFlags[i]) {
super.setSelectionInterval(i, i);
return;
}
}
}
}
}
}
}
リストモデルから適用外のアイテムを削除すると、無効にするのではなく、簡単になります。ユーザーは本当に無効なアイテムを見たいですか?私はそれが何か価値を追加するとは思わないが、代わりに視覚的な混乱を追加します。あなたがでAbstractActionを検索することがあります:あなたはDefaultListSelectionModelを実装する必要が
これは良い点です。いくつかの考えの後、私はそれらを灰色にすることを決めたが、それらを選択できるようにした。 next/previousを使用するとスキップされますが、意図的にグレーアウトされたステップに進むと、ステップを「有効にする」ためにどのようなアクションが必要かを説明するメッセージが表示されます –
一つの解決策場合は、フラグを設定することができますJava API。次に、COMMANDパターンを実装します。
アイデアは、メソッド状態をクラス(AbstractActionを実装する)にすることで、状態を与えることです。その後、彼らはお互いを無効にすることができます。
私が選択することができませんでした細胞とするJListを望んでいたと透明でした。ここに私がしたことがあります:
class DisabledItemListCellRenderer extends JLabel implements ListCellRenderer<Object> {
private static final long serialVersionUID = 1L;
public DisabledItemListCellRenderer() {
setOpaque(false);
}
@Override
public Component getListCellRendererComponent(JList<?> list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
String txt = (String) value;
setText(txt);
return this;
}
}
これは、アイテム。実際にそうする方が良いユースケースがいくつかあります。私はそのようなユースケースを持っており、これは魅力的に機能しました。 –