4

我想在 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;
    }
}

上面的问题是按钮“浏览”将被添加 3 次,我希望它只显示一次,并在其下方显示 Item1 和 Item2 作为普通/常规组合框选择对象。

4

4 回答 4

5

我会避免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();
      }
    } );
  }
}
于 2012-08-23T21:29:17.807 回答
2

在尝试了很多事情之后,我想我找到了答案,我相信当你看到它时它看起来会很容易:

        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;
            }
        }
    }

您现在可以根据需要自定义按钮和标签。

于 2012-08-23T21:07:59.027 回答
1

实际上,您将不得不使用http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer中解释的自定义渲染器。

于 2012-08-23T19:17:55.907 回答
1

根据您想要放置搜索按钮的位置,您可以查看xswingx Prompt/Buddy API。您可以使用它来“伙伴”与编辑器字段的浏览按钮

或者您可以简单地在组合框旁边添加一个浏览按钮。

于 2012-08-23T19:59:25.623 回答