Java 如何将JButton放入JComboBox中
我想在JComboBox中放置一个JButton。此按钮允许用户浏览文件。用户选择的文件将添加到JComboBox列表中。我该怎么做?我是否使用某种渲染器?多谢各位 编辑: 在阅读了有关ListCellRenderer的更多信息后,我尝试了以下代码:Java 如何将JButton放入JComboBox中,java,swing,render,jbutton,jcombobox,Java,Swing,Render,Jbutton,Jcombobox,我想在JComboBox中放置一个JButton。此按钮允许用户浏览文件。用户选择的文件将添加到JComboBox列表中。我该怎么做?我是否使用某种渲染器?多谢各位 编辑: 在阅读了有关ListCellRenderer的更多信息后,我尝试了以下代码: JComboBox comboBox = new JComboBox(new String[]{"", "Item1", "Item2"}); ComboBoxRenderer renderer = new ComboBoxRenderer();
JComboBox comboBox = new JComboBox(new String[]{"", "Item1", "Item2"});
ComboBoxRenderer renderer = new ComboBoxRenderer();
comboBox.setRenderer(renderer);
class ComboBoxRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
JButton jbutton = new JButton("Browse");
return jbutton;
}
}
上面的问题是,“浏览”按钮将被添加3次,我希望它只显示一次,并在其下方显示Item1和Item2作为普通/常规组合框选择对象。实际上,您必须使用上所述的自定义渲染器。取决于您要将搜索按钮放置在何处,你可以看一看。您可以使用此选项将浏览按钮与编辑器字段“配对”
或者,您可以简单地在组合框旁边添加一个浏览按钮。在尝试了很多东西后,我想我找到了答案,我相信当您看到它时,它会看起来非常简单:
JComboBox comboBox = new JComboBox(new String[]{"Item1", "Item2"});
ComboBoxRenderer renderer = new ComboBoxRenderer();
comboBox.setRenderer(renderer);
comboBox.addItem("<<BROWSE>>");
class ComboBoxRenderer implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value.equals("<<BROWSE>>")) {
JButton btn = new JButton("Browse");
return btn;
} else {
JLabel lbl = new JLabel(value.toString());
lbl.setOpaque(true);
return lbl;
}
}
}
JComboBox组合框=新的JComboBox(新字符串[]{“Item1”,“Item2”});
ComboBoxRenderer=新建ComboBoxRenderer();
setRenderer(渲染器);
组合框。添加项(“”);
类ComboBoxRenderer实现ListCellRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
if(值等于(“”){
JButton btn=新JButton(“浏览”);
返回btn;
}否则{
JLabel lbl=新的JLabel(value.toString());
lbl.setOpaque(真);
返回lbl;
}
}
}
现在,您可以按照自己的意愿自定义按钮和标签。我将避免使用
JButton
。完全有可能在您的组合框中获得JButton
的图像,但它不会表现为按钮。你不能点击它,它从不会在视觉上被“按下”或“释放”。简而言之,您的组合框将包含一个用户不熟悉的项目
原因是在getListCellRenderComponent
方法中返回的组件不包含在JCombobox
中。它们只用作邮票。这也解释了为什么您可以(也应该)重用在该方法中返回的组件,而不是一直创建新组件。这都在关于部分的JTable
教程中进行了解释(针对JTable
进行了解释,但对使用渲染器和编辑器的所有其他Swing组件都有效)
如果您真的希望组合框中有一个允许显示文件选择器的项目,我会选择类似于以下SSCCE的内容:
import javax.swing.JComboBox;
import javax.swing.JFrame;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ComboboxTest {
public static void main( String[] args ) {
EventQueue.invokeLater( new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame( "TestFrame" );
JComboBox<String> comboBox = new JComboBox<>(new String[]{"Item1", "Item2"});
final String browse = "<<BROWSE>>";
comboBox.addItem( browse );
comboBox.addItemListener( new ItemListener() {
@Override
public void itemStateChanged( ItemEvent e ) {
if ( e.getStateChange() == ItemEvent.SELECTED &&
browse.equals( e.getItem() ) ){
System.out.println("Show filechooser");
}
}
} );
frame.add( comboBox );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
frame.pack();
}
} );
}
}
import javax.swing.JComboBox;
导入javax.swing.JFrame;
导入java.awt.EventQueue;
导入java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
公共类组合测试{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame(“测试框架”);
JComboBox组合框=新的JComboBox(新字符串[]{“Item1”,“Item2”});
最终字符串浏览=”;
comboBox.addItem(浏览);
comboBox.addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent e){
如果(如getStateChange()==ItemEvent.SELECTED&&
browse.equals(e.getItem()){
System.out.println(“显示文件选择器”);
}
}
} );
frame.add(组合框);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
} );
}
}
谢谢,我真的想把按钮放在组合框内而不是旁边。我本以为会有一种更简单的方法来实现这一点,而不是使用第三方api。从内存来看,comobox的布局似乎是由UI委托完成的(外观和感觉),我可能是错的,但我似乎记得这一点1。不要创建新组件,而是在渲染器2中重用和调整现有组件。您不能简单地使用渲染器来按下按钮。如果只有渲染器,您将如何按下按钮?@Robin:您不会更改按钮的渲染器,只更改JCombobox的渲染器。该按钮仍将在组合框外正常工作。您是否确实尝试过此功能?渲染器中返回的组件不包含在JComboBox
中,因此您将无法按按钮询问详细答案。上面发布的示例显示了如何将事件侦听器添加到浏览组件中,但它仍然作为常规JList文本显示给用户。我见过组合框中有按钮的应用程序,我不确定它们是否是用Java编写的。@jadrijan当然它看起来不像按钮。这就是我想说的。。。您可以使用JButton
,但它的行为永远不会像JButton那样。所以最好不要使用JButton
imo我完全理解你的意思。:)我只是想澄清一下,我所做的并不违反Java“规则”。