我想将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显示为常规/常规组合框选择对象。

最佳答案

我会避免使用JButton。完全有可能在组合框中获取JButton的图像,但它本身不会像按钮一样。您无法单击它,它永远不会在视觉上被“按下”或“释放”,...。简而言之,您的组合框将包含一个用户不熟悉的项目。

这样做的原因是,您在getListCellRendererComponent方法中返回的组件未包含在JCombobox中。它们仅用作邮票。这也解释了为什么您可以(并且应该)复用在该方法中返回的Component,而不是始终都没有创建新组件。在JTable教程中有关Renderers and Editors的部分中对此进行了全部解释(解释为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();
      }
    } );
  }
}

09-30 18:06
查看更多