jad*_*jan 4 java swing render jbutton jcombobox
我想在 JComboBox 中放置一个 JButton。此按钮允许用户浏览文件。用户选择的文件被添加到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的问题是按钮“浏览”将被添加 3 次,我希望它只显示一次并在它下方显示 Item1 和 Item2 作为普通/常规组合框选择对象。
我会避免JButton. 完全有可能JButton在您的组合框中获取 a 的图像,但它不会将自己视为按钮。你不能点击它,它永远不会在视觉上被“按下”或“释放”,......。简而言之,您的组合框将包含一个用户不熟悉的项目。
原因是你在getListCellRendererComponent方法中返回的组件没有包含在JCombobox. 它们仅用作邮票。这也解释了为什么您可以(并且应该)重用Component您在该方法中返回的内容,而不是一直创建新组件。这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();
}
} );
}
}
Run Code Online (Sandbox Code Playgroud)