0

次のコードを見てください

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class JCombo extends JFrame
{
    JComboBox com1,com2;

    public JCombo()
    {


        com1 = new JComboBox();
        com2 = new JComboBox();

        com1.addItem("One");
        com1.addItem("two");
        com1.addItem("Three");

        com2.addItem("Clothe");
        com2.addItem("Food");
        com2.addItem("Drinks");
        com2.addItemListener(new Com2Action());

        this.setLayout(new FlowLayout());
        this.add(com1);
        this.add(com2);

        this.pack();
        this.validate();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private class Com2Action implements ItemListener
    {
        public void itemStateChanged(ItemEvent ae)
        {
            if(ae.getStateChange() == ItemEvent.SELECTED)
            {
                com1.getSelectedItem();
            }
        }
    }

    public static void main(String[]args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            new JCombo();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
}

今ここで、私がする必要があるのはこれです。

  1. com2から項目を選択
  2. com2 から項目を選択した時点で、com1 にある項目を強調表示します。その強調表示は永続的に存在する必要があります (つまり、ユーザーが com1 を再度クリックしても、強調表示が消えてはなりません)。

例: com2 から「食品」を選択します。その際、com1には「One」が表示されます。だから、それを強調する

どうすればこれを行うことができますか? 助けてください!

4

2 に答える 2

3

2つの方法があります

  • キーの値を変更するUIManager

  • オーバーライドisSelected_DefaultListCellRenderer

例えば

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;

public class ComboRendererTest {

    public ComboRendererTest() {
        JComboBox comboBox = new JComboBox();
        comboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXX");
        comboBox.addItem(new Double(1));
        comboBox.addItem(new Double(2.25));
        comboBox.addItem(new Double(3.5));
        comboBox.setRenderer(new TwoDecimalRenderer(comboBox.getRenderer()));
        comboBox.setEditable(true);

        JComboBox comboBox1 = new JComboBox();
        comboBox1.setPrototypeDisplayValue("XXXXXXXXXXXXXXXX");
        comboBox1.addItem(new Double(1));
        comboBox1.addItem(new Double(2.25));
        comboBox1.addItem(new Double(3.5));
        comboBox1.setRenderer(new TwoDecimalRenderer(comboBox.getRenderer()));
        comboBox1.setEditable(true);

        JFrame frame = new JFrame();
        frame.add(comboBox, BorderLayout.NORTH);
        frame.add(comboBox1, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                ComboRendererTest comboRendererTest = new ComboRendererTest();
            }
        });
    }
}

class TwoDecimalRenderer extends DefaultListCellRenderer {

    private ListCellRenderer defaultRenderer;

    public TwoDecimalRenderer(ListCellRenderer defaultRenderer) {
        this.defaultRenderer = defaultRenderer;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        Component c = defaultRenderer.getListCellRendererComponent(
                list, value, index, isSelected, cellHasFocus);
        if (c instanceof JLabel) {
            if (isSelected) {
                c.setBackground(Color.blue);
            } else {
                c.setBackground(Color.red);
            }
        } else {
            c.setBackground(Color.red);
            c = super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
        }
        return c;
    }
}
于 2012-12-02T06:08:58.203 に答える
0

JComboBox.setRenderer(ListCellRenderer aRenderer) を使用してカスタム レンダラーを設定します。

于 2012-12-02T06:01:39.947 に答える