Java 如何为searchbar开发下拉列表?

Java 如何为searchbar开发下拉列表?,java,database,swing,jtable,Java,Database,Swing,Jtable,我想用java开发一个搜索栏,但在每次按键释放事件之后,我想在表中显示建议,而不是列表,因为我想显示数据库中的两列作为建议 有许多组合框的解决方案,但我希望表作为一个弹出显示建议 您可以创建一个组合框,其中显示两列数据。例如: import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.text.*; public class ComboBoxM

我想用java开发一个搜索栏,但在每次按键释放事件之后,我想在表中显示建议,而不是列表,因为我想显示数据库中的两列作为建议

有许多组合框的解决方案,但我希望表作为一个弹出显示建议

您可以创建一个组合框,其中显示两列数据。例如:

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;
        }
    }

}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.text.*;
公共类ComboBoxMultiColumn扩展JFrame
{
公共ComboxMultiColumn()
{
getContentPane().setLayout(新的GridLayout(0,2));
向量项=新向量();
项目.附录(新项目(“123456789”、“Car”);
项目.附录(新项目(“23”,“平面”);
项目.附录(新项目(“345”、“列车”);
增编(新项目(“4567”,“核潜艇”);
//使用JTextArea作为渲染器
JComboBox comboBox1=新的JComboBox(项目);
comboBox1.setRenderer(新的TextAreaRenderer(5));
getContentPane().add(新的JLabel(“TextArea渲染器”);
getContentPane().add(comboBox1);
//使用JTextPane作为渲染器
JComboBox comboBox2=新的JComboBox(项目);
comboBox2.setRenderer(新的TextPaneRenderer(10));
getContentPane().add(新的JLabel(“TextPane渲染器”);
getContentPane().add(comboBox2);
//使用JPanel作为渲染器
JComboxCombox3=新的JCombox3(项目);
comboBox3.setRenderer(新的PanelRenderer(50));
getContentPane().add(新的JLabel(“面板渲染器”);
getContentPane().add(comboBox3);
//使用HTML
JComboxCombox4=新的JCombox4(项目);
setRenderer(新的HTMLRenderer());
getContentPane().add(新的JLabel(“HTML呈现程序”);
getContentPane().add(comboBox4);
}
类项目
{
私有字符串id;
私有字符串描述;
公共项(字符串id、字符串描述)
{
this.id=id;
this.description=描述;
}
公共字符串getId()
{
返回id;
}
公共字符串getDescription()
{
返回说明;
}
公共字符串toString()
{
返回说明;
}
}
公共静态void main(字符串[]args)
{
JFrame frame=新ComboBoxMultiColumn();
frame.setDefaultCloseOperation(关闭时退出);
frame.pack();
frame.setVisible(true);
}
/*
**选项卡在JTextArea中更容易使用,但不是很灵活
*/
类TextAreaRenderer扩展JTextArea实现ListCellRenderer
{
公共TextAreaRenderer(int-tabSize)
{
setTabSize(tabSize);
}
公共组件GetListCellRenderComponent(JList列表、对象值、,
整型索引,布尔型isSelected,布尔型cellHasFocus)
{
项目=(项目)值;
setText(item.getId()+“\t”+item.getDescription());
setBackground(isSelected?list.getSelectionBackground():null);
setForeground(isSelected?list.getSelectionForeground():null);
归还这个;
}
}
/*
**选项卡在JTextPane中很难使用,但要灵活得多
*/
类TextPaneRenderer扩展JTextPane实现ListCellRenderer
{
公共TextPaneRenderer(int选项卡列)
{
setMargin(新插图(0,0,0,0));
FontMetrics fm=getFontMetrics(getFont());
int width=fm.charWidth('w')*tabColumn;
TabStop[]tabs=新TabStop[1];
制表符[0]=新制表符(宽度,制表符.ALIGN\u LEFT,制表符.LEAD\u NONE);
TabSet TabSet=新的TabSet(tabs);
SimpleAttributeSet属性=新的SimpleAttributeSet();
setTabSet(属性,tabSet);
getStyledDocument().setParagraphAttributes(0,0,attributes,false);
}
公共组件GetListCellRenderComponent(JList列表、对象值、,
整型索引,布尔型isSelected,布尔型cellHasFocus)
{
项目=(项目)值;
如果(索引==-1)
setText(item.getDescription());
其他的
setText(item.getId()+“\t”+item.getDescription());
setBackground(isSelected?list.getSelectionBackground():null);
setForeground(isSelected?list.getSelectionForeground():null);
归还这个;
}
}
/*
**使用面板来容纳多个零部件
*/
类PanelRenderer实现ListCellRenderer
{
私有JPanel渲染器;
私人JLabel优先;
二等兵;
公共面板渲染器(int firstColumnWidth)
{
renderer=newjpanel();
setLayout(新的BoxLayout(renderer,BoxLayout.X_轴));
第一个=新的JLabel(“”);
维度d=first.getPreferredSize();
d、 宽度=第一列宽度;
第一,设置最大尺寸(d);
第二个=新的JLabel();
添加(第一个);
添加(第二个);
}
公共组件GetListCellRenderComponent(JList列表、对象值、,
整型索引,布尔型isSelected,布尔型cellHasFocus)
{
项目=(项目)值;
first.setText(item.getId());
second.setText(item.getDescription());
renderer.setBackground(isSelected?list.getSelectionBackground():null);
renderer.setForeground(isSelected?list.getSelectionForeground():null);
返回渲染器;
}
}
/*
**使用HTML格式化文本
*/
类HTMLRenderer扩展了DefaultListCellRenderer