Java Swing - 在组合框上搜索

标签 java swing jcombobox

我想搜索组合框,请帮助我 http://i.imgur.com/Zao8U0S.png

代码为herehere

最佳答案

不完全是您想要的(因为您无法在下拉列表中显示标题),但以下代码显示了可以在组合框下拉列表中显示多列的自定义渲染器示例:

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

public class ComboBoxMultiColumn extends JFrame
{
    public ComboBoxMultiColumn()
    {
        getContentPane().setLayout( new GridLayout(0, 2) );

        Vector items = new Vector();
        items.addElement( new Item("123456789", "Car" ) );
        items.addElement( new Item("23", "Plane" ) );
        items.addElement( new Item("345", "Train" ) );
        items.addElement( new Item("4567", "Nuclear Submarine" ) );

        //  Use a JTextArea as a renderer

        JComboBox comboBox1 = new JComboBox( items );
        comboBox1.setRenderer( new TextAreaRenderer(5) );

        getContentPane().add( new JLabel("TextArea Renderer") );
        getContentPane().add( comboBox1 );

        //  Use a JTextPane as a renderer

        JComboBox comboBox2 = new JComboBox( items );
        comboBox2.setRenderer( new TextPaneRenderer(10) );

        getContentPane().add( new JLabel("TextPane Renderer") );
        getContentPane().add( comboBox2 );

        //  Use a JPanel as a renderer

        JComboBox comboBox3 = new JComboBox( items );
        comboBox3.setRenderer( new PanelRenderer(50) );

        getContentPane().add( new JLabel("Panel Renderer") );
        getContentPane().add( comboBox3 );

        //  Using HTML

        JComboBox comboBox4 = new JComboBox( items );
        comboBox4.setRenderer( new HTMLRenderer() );

        getContentPane().add( new JLabel("HTML Renderer") );
        getContentPane().add( comboBox4 );
    }

    class Item
    {
        private String id;
        private String description;

        public Item(String id, String description)
        {
            this.id = id;
            this.description = description;
        }

        public String getId()
        {
            return id;
        }

        public String getDescription()
        {
            return description;
        }

        public String toString()
        {
            return description;
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxMultiColumn();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
    }

    /*
    **  Tabs are easier to use in a JTextArea, but not very flexible
    */
    class TextAreaRenderer extends JTextArea implements ListCellRenderer
    {
        public TextAreaRenderer(int tabSize)
        {
            setTabSize(tabSize);
        }

        public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus)
        {
            Item item = (Item)value;
            setText(item.getId() + "\t" + item.getDescription());
            setBackground(isSelected ? list.getSelectionBackground() : null);
            setForeground(isSelected ? list.getSelectionForeground() : null);
            return this;
        }
    }

    /*
    **  Tabs are harder to use in a JTextPane, but much more flexible
    */
    class TextPaneRenderer extends JTextPane implements ListCellRenderer
    {
        public TextPaneRenderer(int tabColumn)
        {
            setMargin( new Insets(0, 0, 0, 0) );

            FontMetrics fm = getFontMetrics( getFont() );
            int width = fm.charWidth( 'w' ) * tabColumn;

            TabStop[] tabs = new TabStop[1];
            tabs[0] = new TabStop( width, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE );
            TabSet tabSet = new TabSet(tabs);

            SimpleAttributeSet attributes = new SimpleAttributeSet();
            StyleConstants.setTabSet(attributes, tabSet);
            getStyledDocument().setParagraphAttributes(0, 0, attributes, false);
        }

        public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus)
        {
            Item item = (Item)value;

            if (index == -1)
                setText( item.getDescription() );
            else
                setText(item.getId() + "\t" + item.getDescription());

            setBackground(isSelected ? list.getSelectionBackground() : null);
            setForeground(isSelected ? list.getSelectionForeground() : null);
            return this;
        }
    }

    /*
    **  Use a panel to hold multiple components
    */
    class PanelRenderer implements ListCellRenderer
    {
        private JPanel renderer;
        private JLabel first;
        private JLabel second;

        public PanelRenderer(int firstColumnWidth)
        {
            renderer = new JPanel();
            renderer.setLayout(new BoxLayout(renderer, BoxLayout.X_AXIS) );

            first = new JLabel(" ");
            Dimension d = first.getPreferredSize();
            d.width = firstColumnWidth;
            first.setMaximumSize(d);
            second = new JLabel();
            renderer.add(first );
            renderer.add(second );
        }

        public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus)
        {
            Item item = (Item)value;

            first.setText( item.getId() );
            second.setText( item.getDescription() );

            renderer.setBackground(isSelected ? list.getSelectionBackground() : null);
            renderer.setForeground(isSelected ? list.getSelectionForeground() : null);

            return renderer;
        }
    }

    /*
    **  Use HTML to format the text
    */
    class HTMLRenderer extends DefaultListCellRenderer
    {
        private static final String START = "<html><table><tr><td width=40>";
        private static final String MIDDLE = "</td><td width=120>";
        private static final String END = "</td></tr></table></html>";

        public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(
                list, value, index, isSelected, cellHasFocus);

            Item item = (Item)value;
            setText(START
                + item.getId()
                + MIDDLE
                + item.getDescription()
                + END);

            return this;
        }
    }

}

正如您将看到的,如果运行代码,每列中的文本对齐将成为问题,因为组合框的设计目的不是显示多个数据,因为每个单元格都是独立于其他单元格呈现的,因此一个单元格不知道每列数据的宽度。您需要以某种方式对宽度进行硬编码。

正如您所看到的,组合框可能不是一个很好的解决方案。

关于Java Swing - 在组合框上搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31737605/

相关文章:

java - 在数组中搜索类(class)

java - 在字符串中插入变量

java - 禁止 Java URL 获取本地文件?

java - 为什么事件没有发布到 AWT EventQueue?

java - 如何使用 Maven 使可执行 jar 在一段时间内选择属性文件

java - 读取文本文件中一行中特定数量的字符并将 "read characters"设置为 JTextArea

Java 数据绑定(bind)最佳实践

java - 即使数据可用,如何在 JComboBox 中设置空字符串?

java - 从 JComboBox 中选择名称后,如何获得积分以显示在我的程序上?

java - DefaultComboBoxModel 和 JCombobox 之间的通信