如何创建一个JComboBox,其元素各有两种不同的样式?

时间:2017-04-25 11:09:35

标签: java swing jcombobox renderer

我正在使用Swing创建Java应用程序。它包含一个带有JComboBox的JTextField,其中包含最后输入的单词以及输入这些单词的时间。带有时间的String应该是最后输入的单词(标准样式)的另一种大小和颜色(较小和浅灰色)。所以在JComboBox的每个元素中都应该使用两种不同的样式。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

以下是一个例子:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Date;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class ComboSample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ComboSample());
    }

    @Override
    public void run() {
        JFrame frm = new JFrame("Combo example");
        final JTextField fld = new JTextField(20);
        TextData[] data = new TextData[]{new TextData("First", new Date(System.currentTimeMillis() - 100000)), 
                new TextData("Second", new Date(System.currentTimeMillis() - 200000)),
                new TextData("Third", new Date(System.currentTimeMillis() - 300000)),
                new TextData("Fourth", new Date(System.currentTimeMillis() - 400000))};
        JComboBox<TextData> cb = new JComboBox<>(data);
        cb.setSelectedItem(null);
        cb.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JComboBox cb = (JComboBox) e.getSource();
                TextData td = (TextData) cb.getSelectedItem();
                if (td != null) {
                    fld.setText(td.getText());
                }
            }
        });
        frm.add(fld);
        frm.add(cb, BorderLayout.EAST);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class TextData {
        private static final DateFormat FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
        private final String text;
        private final Date timestamp;
        public TextData(String text, Date timestamp) {
            this.text = text;
            this.timestamp = timestamp;
        }
        public String getText() {
            return text;
        }
        @Override
        public String toString() {
            return "<html>" + text + " <span style=\"color:#D3D3D3\"><i>" +  FORMAT.format(timestamp) + "</i></span></html>";
        }
    }
}

答案 1 :(得分:0)

一种简单的方法是选择外观,以实现这一目标。 另一种方法是使用每个JComboBox元素所需的背景颜色创建不同的JLabel,并添加它们:

JLabel label = new JLabel("Some text");
label.setBackground(Color.grey);
label.setOpaque(true);

jComboBox.addItem(label);

JLabel anotherLabel = new JLabel("Another text");
anotherLabel.setBackground(Color.white);
anotherLabel.setOpaque(true);

jComboBox.addItem(anotherLabel);