我想将JButton放在JComboBox中。此按钮允许用户浏览文件。用户选择的文件将添加到JComboBox列表中。我该怎么做呢?我是否使用某种渲染器?谢谢。
修改 在阅读了有关ListCellRenderer的更多信息后,我尝试了以下代码:
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作为普通/常规组合框选择对象。
答案 0 :(得分:4)
我会避免使用JButton
。完全可以在组合框内获得JButton
的图像,但它不会像按钮那样表现自己。你无法点击它,它永远不会被视觉上“按下”或“释放”,....简而言之,您的组合框将包含一个您的用户不熟悉的项目。
原因是您在getListCellRendererComponent
方法中返回的组件未包含在JCombobox
中。它们仅用作邮票。这也解释了为什么你可以(并且应该)重用在该方法中返回的Component
,而不是一直创建新的组件。有关Renderers and Editors的部分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();
}
} );
}
}
答案 1 :(得分:1)
实际上,您必须按http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer上的说明使用自定义渲染器。
答案 2 :(得分:1)
根据您要放置搜索按钮的位置,您可以查看xswingx Prompt/Buddy API。您可以使用它来“编辑”浏览按钮和编辑器字段
或者您只需在组合框旁边添加一个浏览按钮。
答案 3 :(得分:1)
在尝试了很多事情后,我想我已经找到了答案,我相信当你看到它时看起来很容易:
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;
}
}
}
您现在可以按照自己的方式自定义按钮和标签。