如何把一个JButton的JComboBox内(How to put a JButton insid

2019-09-21 13:41发布

我想提出一个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次,我希望它显示只有一次,它下面显示项目1和项目2正常/常规组合框中选择对象。

Answer 1:

我想避免JButton 。 这是完全可能获得的图像JButton你的组合框里面,但不会表现自己作为一个按钮。 你不能点击它,它永远不会被视觉“压”也不是“释放”,......。 总之,你的组合框将包含其行为陌生用户的项目。

这样做的原因是,您在返回组件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();
      }
    } );
  }
}


Answer 2:

事实上,你将有上讲解了使用自定义呈现http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer 。



Answer 3:

这取决于你想要把搜索按钮,你可以看看在xswingx提示/好友API 。 你可以用编辑栏中使用这个“哥们”的浏览按钮

或者你可以简单地添加旁边的组合框中选择一个浏览按钮。



Answer 4:

尝试了很多事情之后,我想我找到了答案,我相信当你看到它,它会显得很轻松:

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

现在,您可以自定义按钮和标签你希望的任何方式。



文章来源: How to put a JButton inside a JComboBox