2013-07-26 79 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,这将允许你在文本组件 – MadProgrammer

+0

中“伙伴”一个其他组件,它们确实添加了编辑器有一个内部类textPanel(一个按钮和一个jtextfield)。我试图把按钮只是为了清除编辑器中键入的所有文本。如果您键入文本查询是制作的 – GoAntonio

+0

其实,已经通读了问题,您认为在窗格上的字段不是 – MadProgrammer

回答

6

第一组的问题,我可以看到的是,您可以定义一个NewComboEditorJTextFieldJButton,还定义了一个textPanel,它包含了所有这些事情的任何方式。但是不要使用textPane上的组件,而是使用新创建的组件(在NewComboEditor中),而不是......实际上,我甚至不确定这是如何工作的,因为您从不初始化这些组件(在NewComboEditor中) ,所以应该有一个NullPointerException ...

如果这还不够的问题,在JTextFieldJButton不加入任何东西反正...

,而不是...

  • NewComboEditor应该不需要分机结束任何事情(或者如果你真的想要,它可以从textPane延伸)。
  • 到现场的所有引用应到文本字段进行的textPane

举个例子...

enter image description here

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

    } 

} 

现在,如果你想设置字段属性与组合框相同,我只需将组合框的引用传递给编辑器并允许它提取所需的属性(即字体,颜色等)

+0

谢谢你队友=)它很好地工作。我只是想知道你是怎么想出来的(addNotify方法),我应该阅读一本特别的摇摆书,考虑到我是新来的java和自定义swing类。 – GoAntonio

+0

这是我前段时间推荐给我的东西。我只是推荐阅读JavaDocs – MadProgrammer