有才華的人,別忘記給滋潤你的那塊土壤施肥

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            28 隨筆 :: 5 文章 :: 147 評論 :: 0 Trackbacks
              
              需要做一個可編輯的JComboBox,即可以在里面輸入查找,也可以選擇下拉框選擇。但兩者都必須在操作完后,comboBox的輸入框都必須高亮顯示,如圖:

                                                           

          但是把鼠標點擊輸入框或者在里面輸入數(shù)字按回車進行匹配時,都可是得輸入框高亮顯示,但是按那個下拉框按鈕進行選擇時卻不能使其高亮顯示,不知道怎么會事,希望高手指點。

          以下為測試代碼:
          package kissJava.JComboBox;
          import java.awt.BorderLayout;
          import java.awt.Container;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.awt.event.MouseEvent;
          import java.util.Vector;
          import javax.swing.ComboBoxEditor;
          import javax.swing.DefaultComboBoxModel;
          import javax.swing.JComboBox;
          import javax.swing.JFrame;
          import javax.swing.JScrollPane;
          import javax.swing.JTextArea;
          import javax.swing.JTextField;
          public class EditComboBox{
               String labels[] 
          = "Chardonnay""Sauvignon""Riesling""Cabernet",
                          
          "Zinfandel""Merlot""Pinot Noir""Sauvignon Blanc",
                          
          "Syrah""Gewurztraminer" }
          ;
                String code[] 
          = "1""2""3""4","5""6""7""8""9""10" };
               JComboBox comboBox 
          =null;
               
          final KJComboBoxEditor kjce = new KJComboBoxEditor();
               
          public EditComboBox(){
                    JFrame frame 
          = new JFrame("Editable JComboBox");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    Container contentPane 
          = frame.getContentPane();
                    comboBox 
          = new JComboBox();
                    comboBox.setMaximumRowCount(
          5);  
                    comboBox.setEditable(
          true);
                    initCombox();  
                    comboBox.setEditor(kjce);
                    contentPane.add(comboBox, BorderLayout.NORTH);  
                    
          final JTextArea textArea = new JTextArea();
                    JScrollPane scrollPane 
          = new JScrollPane(textArea);
                    contentPane.add(scrollPane, BorderLayout.CENTER);
                    ActionListener actionListener 
          = new ActionListener() {
                       
          public void actionPerformed(ActionEvent actionEvent) {
                            textArea.append(
          "Selected: " + comboBox.getSelectedItem());
                            textArea.append(
          ", Position: " + comboBox.getSelectedIndex());
                            textArea.append(System.getProperty(
          "line.separator"));
                            comboBox.requestFocus();
                            kjce.selectAll();
                       }

                    }
          ;
                   comboBox.addActionListener(actionListener);
                   frame.setSize(
          300200);
                   frame.setVisible(
          true);
            }

            
          private void initCombox(){
                
          final Vector<String> v = new Vector<String>(code.length);
                String[] str 
          = new String[code.length];
                
          for(int i = 0,length = code.length; i<length;i++{
                        str[i] 
          = code[i] + " - " + labels[i];
                        v.add(str[i]);            
                }

                comboBox.setModel(
          new DefaultComboBoxModel(v));
            }

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

            
          class KJComboBoxEditor implements ComboBoxEditor {    
              JTextField jtf 
          = new JTextField();    
              
          public KJComboBoxEditor(){
                  jtf.addActionListener(
          new java.awt.event.ActionListener(){
                      
          public void actionPerformed(ActionEvent e) {
                          
          boolean isExit = false;
                          String codeStr 
          = jtf.getText().trim();
                          
          for(int i = 0,length = code.length; i<length;i++{
                               
          if(codeStr.equals(code[i])){
                                  
          //jtf.setText(code[i] + " - " + labels[i]);
                                   setItem(code[i] + " - " + labels[i]);
                                   comboBox.setSelectedIndex(i);
                                   isExit 
          = true;
                               }
                            
                          }

                           
          if(!isExit)
                               jtf.setText(
          ""); 
                           }

                           selectAll();                 
                      }
              
                  }
          );
              
                  jtf.addMouseListener(
          new java.awt.event.MouseListener(){
                      
          public void mouseClicked(MouseEvent e) {
                          selectAll();
                          comboBox.setPopupVisible(
          false);
                      }

                      
          public void mouseEntered(MouseEvent e) {    
                      }

                      
          public void mouseExited(MouseEvent e) {        
                      }

                      
          public void mousePressed(MouseEvent e) {
                          selectAll(); 
                          comboBox.setPopupVisible(
          false);
                      }

                      
          public void mouseReleased(MouseEvent e) {    
                          selectAll(); 
                      }
                  
                  }
          );
              }

              
          public void addActionListener(ActionListener l) {
              }

              
          public JTextField getEditorComponent() {
                  
          return jtf;
              }

              
          public Object getItem() {        
                  
          return jtf.getText();
              }

              
          public void removeActionListener(ActionListener l) {    
              }

              
          public void selectAll() {    
                  jtf.selectAll();
                  jtf.requestFocus();
                  
              }

              
          public void setItem(Object anObject) {        
                  jtf.setText(anObject.toString());
              }
            
            }

          }
          posted on 2008-04-02 15:27 kissjava 閱讀(2418) 評論(3)  編輯  收藏 所屬分類: swing

          評論

          # re: 如何使可編輯的JComboBox的輸入框高亮顯示? 2008-04-02 16:40 枯寬
          自己頂一下
          為什么調(diào)用了KJComboBoxEditor 的selectAll()方法,他就是不高亮顯示呢?  回復(fù)  更多評論
            

          # re: 如何使可編輯的JComboBox的輸入框高亮顯示? 2008-04-03 10:00 枯寬
          想了好久,沒辦法只好拿他的JComboBox自己的Editor:(JTextComponent)comboBox.getEditor().getEditorComponent()。這樣就能滿足要求,都可以實現(xiàn)高亮顯示。

          但不知道為什么自己實現(xiàn)的ComboBoxEditor 明明調(diào)用了selectAll()方法,卻不高亮顯示,有待拷之。。。  回復(fù)  更多評論
            

          # re: 如何使可編輯的JComboBox的輸入框高亮顯示? 2011-04-13 14:27 zerone
          我用以下方法解決了,也就是在selectAll()后調(diào)用requestFocusInWindow()即可。
          textArea.requestFocusInWindow();  回復(fù)  更多評論
            

          主站蜘蛛池模板: 四会市| 大兴区| 信丰县| 宁津县| 清丰县| 炎陵县| 仪陇县| 化州市| 崇义县| 海林市| 镇宁| 安阳市| 阿拉善盟| 西吉县| 将乐县| 镇沅| 温州市| 毕节市| 黑龙江省| 曲靖市| 鄯善县| 晋城| 安阳县| 亚东县| 临洮县| 辽阳县| 曲阜市| 东源县| 扎囊县| 蒲城县| 康马县| 神木县| 华宁县| 云安县| 双峰县| 高密市| 天祝| 随州市| 龙岩市| 古浪县| 错那县|