1

例として、 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;
    }
 }
4

1 に答える 1

1
  • 前の質問で説明したように、使用できますMouseEvent.consume()が、XxxRenderer

  • (私は何かコメントしたくありません) 選択は に保存する必要がありますXxxModel。そうしないと、すべての試みが間違っているか、より良い場合は別の副作用によって引き起こされます

  • たとえば、 を使用してmodel_to_view....DefaultListSelectionModel

ここに画像の説明を入力

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;
                        }
                    }
                }
            }
        }
    }
}
于 2013-10-07T10:50:32.960 に答える