Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JButton放入JComboBox中_Java_Swing_Render_Jbutton_Jcombobox - Fatal编程技术网

Java 如何将JButton放入JComboBox中

Java 如何将JButton放入JComboBox中,java,swing,render,jbutton,jcombobox,Java,Swing,Render,Jbutton,Jcombobox,我想在JComboBox中放置一个JButton。此按钮允许用户浏览文件。用户选择的文件将添加到JComboBox列表中。我该怎么做?我是否使用某种渲染器?多谢各位 编辑: 在阅读了有关ListCellRenderer的更多信息后,我尝试了以下代码: JComboBox comboBox = new JComboBox(new String[]{"", "Item1", "Item2"}); ComboBoxRenderer renderer = new ComboBoxRenderer();

我想在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作为普通/常规组合框选择对象。

实际上,您必须使用上所述的自定义渲染器。

取决于您要将搜索按钮放置在何处,你可以看一看。您可以使用此选项将浏览按钮与编辑器字段“配对”


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

在尝试了很多东西后,我想我找到了答案,我相信当您看到它时,它会看起来非常简单:

        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;
            }
        }
    }
JComboBox组合框=新的JComboBox(新字符串[]{“Item1”,“Item2”});
ComboBoxRenderer=新建ComboBoxRenderer();
setRenderer(渲染器);
组合框。添加项(“”);
类ComboBoxRenderer实现ListCellRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
if(值等于(“”){
JButton btn=新JButton(“浏览”);
返回btn;
}否则{
JLabel lbl=新的JLabel(value.toString());
lbl.setOpaque(真);
返回lbl;
}
}
}

现在,您可以按照自己的意愿自定义按钮和标签。

我将避免使用
JButton
。完全有可能在您的组合框中获得
JButton
的图像,但它不会表现为按钮。你不能点击它,它从不会在视觉上被“按下”或“释放”。简而言之,您的组合框将包含一个用户不熟悉的项目

原因是在
getListCellRenderComponent
方法中返回的组件不包含在
JCombobox
中。它们只用作邮票。这也解释了为什么您可以(也应该)重用在该方法中返回的
组件,而不是一直创建新组件。这都在关于部分的
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();
      }
    } );
  }
}
import javax.swing.JComboBox;
导入javax.swing.JFrame;
导入java.awt.EventQueue;
导入java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
公共类组合测试{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame(“测试框架”);
JComboBox组合框=新的JComboBox(新字符串[]{“Item1”,“Item2”});
最终字符串浏览=”;
comboBox.addItem(浏览);
comboBox.addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent e){
如果(如getStateChange()==ItemEvent.SELECTED&&
browse.equals(e.getItem()){
System.out.println(“显示文件选择器”);
}
}
} );
frame.add(组合框);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
} );
}
}

谢谢,我真的想把按钮放在组合框内而不是旁边。我本以为会有一种更简单的方法来实现这一点,而不是使用第三方api。从内存来看,comobox的布局似乎是由UI委托完成的(外观和感觉),我可能是错的,但我似乎记得这一点1。不要创建新组件,而是在渲染器2中重用和调整现有组件。您不能简单地使用渲染器来按下按钮。如果只有渲染器,您将如何按下按钮?@Robin:您不会更改按钮的渲染器,只更改JCombobox的渲染器。该按钮仍将在组合框外正常工作。您是否确实尝试过此功能?渲染器中返回的组件不包含在
JComboBox
中,因此您将无法按按钮询问详细答案。上面发布的示例显示了如何将事件侦听器添加到浏览组件中,但它仍然作为常规JList文本显示给用户。我见过组合框中有按钮的应用程序,我不确定它们是否是用Java编写的。@jadrijan当然它看起来不像按钮。这就是我想说的。。。您可以使用
JButton
,但它的行为永远不会像JButton那样。所以最好不要使用
JButton
imo我完全理解你的意思。:)我只是想澄清一下,我所做的并不违反Java“规则”。