例として、 mKorbelによるこの例を取り上げます。
mKorbel によって提案されたメカニズムを使用して、目的の動作を作成することができました。これは、1 つの行が緑色に塗られている (選択されていない) 限り機能します。ただし、1行追加して選択してから新しい行を追加すると、正常に動作し、選択されていない新しい行が得られます。2行目を追加して選択すると、正しく赤く塗られますが、2行目の後にさらに行を追加すると(2つの赤い行)、デフォルトですべて選択されます。これは私が望むものではありません。クリックするまで(ダブルクリックするまで)すべての行を緑色にしたい。なぜこれが起こっているのか誰にも分かりますか?1 つのセルが選択されていない限り、なぜ機能するのですか? 2 つ以上の行またはすべての行が選択されている場合、選択モードで新しい行が追加され続けるのはなぜですか? THNX
マウス イベントのコードは次のとおりです。
m_list = new JList<String>(m_listModel)
{
private MyCellRenderer cellRenderer = new MyCellRenderer();
// emulate control down for multiple non contiguous selection on the
// list.
@Override
// TODO fix here
public void processMouseEvent(MouseEvent event) {
int modifiers = event.getModifiers() | InputEvent.CTRL_MASK;
m_myME = new MouseEvent((Component) event.getSource(),
event.getID(), event.getWhen(), modifiers,
event.getX(), event.getY(), event.getXOnScreen(),
event.getYOnScreen(), event.getClickCount(),
event.isPopupTrigger(), event.getButton());
//if clicked twice
if (event.getClickCount() == 2) {
//if the flag is set to true consume event
if ((MyCellRenderer.getFlag() == true)) {
m_urlName = MyCellRenderer.getValue();
m_myME.consume();
//initiate parsing
initiateParsing();
}else{
m_urlName = MyCellRenderer.getValue();
}
//if it is not consume it will emulate CTRL_MASK
if (!m_myME.isConsumed()) {
super.processMouseEvent(m_myME);
m_urlName = MyCellRenderer.getValue();
//initiate parsing process
initiateParsing();
}
}
}
};
CellRenderer のコードは次のとおりです。
public static class MyCellRenderer extends JLabel implements
ListCellRenderer {
private static final long serialVersionUID = 1L;
private static boolean myFlag = false;
private static String thisValue;
public MyCellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
Color background = null;
Color foreground = null;
if (isSelected == true) {
background = Color.RED;
foreground = Color.WHITE;
myFlag = true;
} else {
background = Color.GREEN;
foreground = Color.BLACK;
myFlag = false;
}
setBackground(background);
setForeground(foreground);
public static class MyCellRenderer extends JLabel implements
ListCellRenderer {
private static final long serialVersionUID = 1L;
private static boolean myFlag = false;
private static String thisValue;
public MyCellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText(value.toString());
Color background = null;
Color foreground = null;
if (isSelected == true) {
background = Color.RED;
foreground = Color.WHITE;
myFlag = true;
} else {
background = Color.GREEN;
foreground = Color.BLACK;
myFlag = false;
}
setBackground(background);
setForeground(foreground);
// the string where its pointing at
thisValue = value.toString();
m_index = index;
return this;
}
public static boolean getFlag() {
return myFlag;
}
public static String getValue() {
return thisValue;
}
}