gpt4 book ai didi

Java Swing - 在组合框上搜索

转载 作者:行者123 更新时间:2023-12-01 22:11:28 26 4
gpt4 key购买 nike

我想搜索组合框,请帮助我 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com