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回追加され、1回だけ表示され、その下にItem1とItem2が通常/通常のコンボボックス選択オブジェクトとして表示されることです。

4

4 に答える 4

5

私は避けますJButton。コンボボックス内の画像を取得することは完全に可能ですがJButton、ボタンとして動作しません。クリックすることはできません。視覚的に「押された」ことも「離された」こともありません... . つまり、コンボボックスには、ユーザーになじみのない動作をするアイテムが含まれます。

これは、メソッドで返すコンポーネントが にgetListCellRendererComponent含まれていないためJComboboxです。スタンプとしてのみ使用されます。これは、そのメソッドで返されたものを再利用できる (そして再利用する必要がある) 理由も説明してComponentおり、常に新しいコンポーネントを作成する必要はありません。これはすべて、レンダラーとエディターJTableに関する部分のチュートリアルで説明されています (レンダラーとエディターを使用する他のすべての Swing コンポーネントについて説明されています) 。JTable

ファイルチューザーを表示できるコンボボックスのアイテムが本当に必要な場合は、次の 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

検索ボタンを配置する場所に応じて、xswingx Prompt/Buddy APIを参照できます。これを使用して、ブラウズ ボタンとエディター フィールドを「相棒」にすることができます。

または、コンボ ボックスの横にブラウズ ボタンを追加することもできます。

于 2012-08-23T19:59:25.623 に答える
1

実際、 http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#rendererで説明されているように、カスタム レンダラーを使用する必要があります。

于 2012-08-23T19:17:55.907 に答える