2012-08-23 2 views
3

JButton을 JComboBox 안에 넣고 싶습니다. 이 버튼을 사용하여 파일을 탐색 할 수 있습니다. 사용자가 선택한 파일이 JComboBox 목록에 추가됩니다. 어떻게해야합니까? 나는 어떤 종류의 렌더러를 사용합니까? 고맙습니다.JComboBox 안에 JButton을 두는 법

편집 : 의 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를 일반/정기 콤보 상자 선택 개체로 표시합니다.

답변

3

나는 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(); 
     } 
    }); 
    } 
} 
+0

자세한 답변을 해주셔서 감사합니다. Robin.위에 게시 한 예제는 검색 리스너에 이벤트 리스너를 추가하는 방법을 보여 주지만 사용자에게 일반 JList 텍스트로 계속 표시됩니다. ComboBoxes 내부에 Button이있는 응용 프로그램을 보았습니다. Java로 작성되었는지 여부는 확실하지 않습니다. – jadrijan

+0

@jadrijan 물론 버튼처럼 보이지 않습니다. 그것이 내가 말하려고하는 것입니다 ... 당신은'JButton '을 사용할 수 있지만 그것은 결코 하나처럼 행동하지 않을 것입니다. 그래서'JButton'을 사용하지 않는 것이 더 좋습니다. – Robin

+0

Robin을 완벽하게 이해합니다. :) 나는 내가 한 일을하기 위해 자바 "규칙"에 위배되지 않는다는 것을 명확히하고 싶었다. – jadrijan

1

사실, http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer에서 설명한대로 사용자 지정 렌더러를 사용해야합니다.

+1

그리고 당신 만이 있다면 당신은 버튼을 누를 방법 렌더러? – Robin

+0

@Robin : 버튼의 렌더러를 변경하지 않고 JCombobox의 렌더러 만 변경합니다. 콤보 박스 외부와 마찬가지로 버튼은 계속 작동합니다. – Silox

+1

실제로 이것을 시도 했습니까? 렌더러에서 반환 된 구성 요소는'JComboBox'에 포함되어 있지 않으므로 버튼을 누를 수 없게됩니다. – Robin

1

검색 버튼을 넣을 위치에 따라 xswingx Prompt/Buddy API을 살펴볼 수 있습니다. 이것을 사용하여 편집기 필드와 함께 찾아보기 버튼을 "결합"할 수 있습니다.

또는 단순히 콤보 상자 옆에 찾아보기 단추를 추가 할 수 있습니다.

+0

감사합니다. 버튼을 옆에 있지 않고 콤보 상자 안에 넣고 싶습니다. 제 3 자 API를 사용하는 대신에 이것을 할 수있는 더 쉬운 방법이있을 것이라고 생각했을 것입니다. – jadrijan

+1

메모리에서 comobox의 레이아웃이 UI 위임자 (look & feel)에 의해 수행 된 것처럼 보이지만 틀릴 수도 있지만 그게 내가 기억하는 것 같습니다 – MadProgrammer

1

내가 답을 알아 냈다고 생각 많은 것들을 시도 후, 나는 당신이 그것을 볼 때 매우 쉽게 볼 되리라 확신합니다 :

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

는 이제 버튼을 사용자 정의하고 당신이 원하는 방법을 라벨 수 있습니다.

+1

1. 새 구성 요소를 만들지 말고 기존 구성 요소를 재사용하고 조정하십시오. 2. 렌더러를 사용하여 버튼을 누를 수는 없습니다. – Robin

관련 문제