2013-07-26 3 views
1

JComboBox 편집기에 단추를 추가하는 데 막혔지만 버튼을 추가하는 데 성공했지만 편집자에게 처음 입력 할 때 수행 할 작업 수행 이벤트는 받아 들일 수없고 다른 하나는 텍스트를 입력 할 수 없습니다.사용자 정의 JComboBox 편집기

결과 : result

문제 :

problems

@Override 
     public Component getEditorComponent() { 
      return panel; 
     } 

이 내가 panel.jtexfield를 반환하는 경우 난 단지 버튼없이 텍스트 필드를 얻을 문제, 그래서 트릭은 여기에 무엇 ?

여기에 나는 또한 같은에 텍스트 글꼴 및 크기를 설정하고자하는 내 코드

import Store.util.DatabaseHelper; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.plaf.basic.BasicComboBoxEditor; 
import org.hibernate.HibernateException; 
import org.netbeans.lib.awtextra.AbsoluteLayout; 

public class NewComboTest extends JFrame { 

    private ArrayList<Object> shopCart = new ArrayList<Object>(); 
    private JComboBox cb; 
    private static final Object[] comboContents = { 
     "First", "Second", "Third", "Fourth", "Fifth" 
    }; 

    public NewComboTest() { 

     super("New Combo Test"); 
     setLayout(null); 
     cb = new JComboBox(); 
     cb.setRenderer(new NewComboRenderer()); 

     cb.setEditor(new NewComboEditor()); 
     cb.setEditable(true); 

     cb.setSize(new Dimension(350, 100)); 
     for (int i = 0; i < comboContents.length; i++) { 
      cb.addItem(comboContents[ i]); 
     } 
     cb.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("_____________" + cb.getSelectedItem()); 

       shopCart.add(cb.getSelectedItem()); 
       System.out.println("items added" + shopCart); 
      } 
     }); 
     cb.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyReleased(KeyEvent e) { 
       System.out.println("KeyReleased" + cb.getEditor().getItem().toString()); 
       populateModel(cb.getEditor().getItem().toString()); 
      } 
     }); 

     getContentPane().add(cb, new org.netbeans.lib.awtextra.AbsoluteConstraints(320, 200, 480, 50)); 
     setSize(1200, 450); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] arg) { 
     new NewComboTest(); 
    } 

    private class NewComboEditor extends JPanel implements ComboBoxEditor { 

     JTextField tf; 
     JButton eraseButton; 
     textPanel panel = new textPanel(); 

     public NewComboEditor() { 

     } 

     @Override 
     public void addActionListener(ActionListener l) { 
      tf.addActionListener(l); 
     } 

     @Override 
     public Component getEditorComponent() { 
      return panel; 
     } 
     public Component getEditorComponent2() { 
      return panel; 
     } 

     @Override 
     public Object getItem() { 
      return tf.getText(); 

     } 

     @Override 
     public void removeActionListener(ActionListener l) { 
      tf.removeActionListener(l); 
     } 

     @Override 
     public void selectAll() { 
      tf.selectAll(); 
     } 

     @Override 
     public void setItem(Object o) { 
      if (o != null) { 
       tf.setText(tf.getText()); 
      } else { 
       tf.setText(""); 
      } 
     } 

     private class textPanel extends JPanel { 

      JTextField jTextField1 = new JTextField(); 
      JButton jButton1 = new JButton(); 

      public textPanel() { 
       setLayout(new BorderLayout()); 

       jButton1.setBackground(new java.awt.Color(255, 255, 255)); 
       jButton1.setForeground(new java.awt.Color(0, 51, 51)); 
       jButton1.setText("X"); 
       jButton1.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         jTextField1.setText(""); 
        } 
       }); 

       add(jTextField1, BorderLayout.CENTER); 
       add(jButton1, BorderLayout.EAST); 





      } 

      public String getText(){ 
       return jTextField1.getText(); 
      } 
     } 
    } 

    private class NewComboRenderer extends JLabel implements ListCellRenderer { 

     public NewComboRenderer() { 
      setOpaque(true); 
     } 

     public Component getListCellRendererComponent( 
       JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      setText(value.toString()); 

      setBackground(isSelected ? Color.BLUE : Color.white); 
      setForeground(isSelected ? Color.white : Color.red); 
      return this; 
     } 
    } 

    /* public void populateModel(String text) throws HibernateException { 
     java.util.List l = DatabaseHelper.GetProductsBy(text); 

     for (Object object : l) { 
      cb.addItem(object); 
     } 
ignore this its unnecessary. 
*/ 

    } 
} 

있는 콤보 상자에 설정합니다.

+0

버튼과 textField를 패널에 추가 해봤습니까? 다른 문제는 textField가 기본적으로 포커스를 얻지 못한다는 것입니다. 나는 또한 핵심 청취자에 대해 우려하지만, 실제로 더 많은 것을 말할 수있게하기 위해 성취하고자하는 것에 대한 어떠한 맥락도 가지고 있지 않습니다. 당신은 또한 최신 SwingX에서 BuddySupport를 볼 수 있습니다.이 스윙은 텍스트 구성 요소 내에서 다른 구성 요소를 "버디 (buddy)"할 수 있습니다. – MadProgrammer

+0

그들은 실제로 편집기에 내부 클래스 인 textPanel (버튼과 jtextfield)이 추가되었습니다. 난 편집기에 입력 한 모든 텍스트를 지우려면 버튼을 누르려고합니다. 텍스트를 입력하면 쿼리가 만들어집니다. – GoAntonio

+0

사실, 질문을 통해 읽은 부분은 창에 있다고 생각하면 – MadProgrammer

답변

6

내가 볼 수있는 문제의 첫 번째 세트는 당신이 NewComboEditor에서 JTextFieldJButton을 정의 할뿐만 아니라, 모든 것을 어떤 방법을 포함하는하는 textPanel을 정의합니다. 그러나 textPane에있는 구성 요소를 사용하는 대신 새로 생성 된 구성 요소 (NewComboEditor)를 대신 사용하십시오 ... 사실,이 구성 요소를 초기화하지 않기 때문에 실제로 작동하는 방법조차 잘 모르겠습니다 (NewComboEditor) 그 정도로 문제가 아니었다면, 그래서 ..., 대신 JTextFieldJButton 어쨌든 아무것도에 추가되지 않습니다 ...

NullPointerException ...

이 있어야한다

  • NewComboEditor 내선 할 필요가 없습니다. 아무거나에서 끝내십시오 (또는 당신이 진짜로에 원하는 경우에 textPane에서 그 대신에 늘일 수있었습니다). 당신이 설정하려는 경우 필드에
  • 모든 참조는 지금 ... 예로서 textPane

에서 텍스트 필드에

import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionListener; 
import javax.swing.ComboBoxEditor; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class CustomComboBoxEditor { 

    public static void main(String[] args) { 
     new CustomComboBoxEditor(); 
    } 

    public CustomComboBoxEditor() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JComboBox cb = new JComboBox(); 
       cb.addItem("Apple"); 
       cb.addItem("Banana"); 
       cb.addItem("Orange"); 
       cb.setEditable(true); 
       cb.setEditor(new MyComboBoxEditor()); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       frame.add(cb); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MyComboBoxEditor implements ComboBoxEditor { 

     private EditorPane editorPane; 

     public MyComboBoxEditor() { 
      editorPane = new EditorPane(); 
     } 

     @Override 
     public Component getEditorComponent() { 
      return editorPane; 
     } 

     @Override 
     public void setItem(Object anObject) { 
      editorPane.setText(anObject == null ? null : anObject.toString()); 
     } 

     @Override 
     public Object getItem() { 
      return editorPane.getText(); 
     } 

     @Override 
     public void selectAll() { 
      editorPane.selectAll(); 
     } 

     @Override 
     public void addActionListener(ActionListener l) { 
      editorPane.addActionListener(l); 
     } 

     @Override 
     public void removeActionListener(ActionListener l) { 
      editorPane.removeActionListener(l); 
     } 

    } 

    public class EditorPane extends JPanel { 

     private JTextField field; 
     private JButton button; 

     public EditorPane() { 
      field = new JTextField(10); 
      button = new JButton("X"); 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.weightx = 1; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.gridx = 0; 
      add(field, gbc); 
      gbc.weightx = 0; 
      gbc.fill = GridBagConstraints.NONE; 
      gbc.gridx++; 
      add(button, gbc); 
     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
      field.requestFocusInWindow(); 
     } 

     public void selectAll() { 
      field.selectAll(); 
     } 

     public void setText(String text) { 
      field.setText(text); 
     } 

     public String getText() { 
      return field.getText(); 
     } 

     public void addActionListener(ActionListener listener) { 
      field.addActionListener(listener); 
     } 

     public void removeActionListener(ActionListener listener) { 
      field.removeActionListener(listener); 
     } 

    } 

} 

enter image description here

을해야한다 fields 속성을 콤보 상자와 동일하게 만들려면 콤보 상자의 참조를 편집기에 전달하고 필요한 속성 (예 : 글꼴, 색 등)을 추출 할 수있게하십시오.

+0

당신 = 친구) 고마워요. 난 그냥 (addNotify 메서드) 내가 스윙 클래스를 사용자 정의하고 자바에서 새로운 것을 고려하여 스윙 스페셜을 읽어야하는지 궁금하다. – GoAntonio

+0

그것은 얼마 전에 나에게 추천되었던 것이었다. JavaDocs를 통해 읽는 것이 좋습니다. – MadProgrammer

관련 문제