有才华的人,别忘记给滋润你的那块土壤施肥

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  28 随笔 :: 5 文章 :: 147 评论 :: 0 Trackbacks
    
    需要做一个可编辑的JComboBox,即可以在里面输入查找,也可以选择下拉框选择。但两者都必须在操作完后,comboBox的输入框都必须高亮显示,如图:

                                                 

但是把鼠标点击输入框或者在里面输入数字按回车进行匹配时,都可是得输入框高亮显示,但是按那个下拉框按钮进行选择时却不能使其高亮显示,不知道怎么会事,希望高手指点。

以下为测试代码:
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 阅读(2196) 评论(3)  编辑  收藏 所属分类: swing

评论

# re: 如何使可编辑的JComboBox的输入框高亮显示? 2008-04-02 16:40 枯宽
自己顶一下
为什么调用了KJComboBoxEditor 的selectAll()方法,他就是不高亮显示呢?  回复  更多评论
  

# re: 如何使可编辑的JComboBox的输入框高亮显示? 2008-04-03 10:00 枯宽
想了好久,没办法只好拿他的JComboBox自己的Editor:(JTextComponent)comboBox.getEditor().getEditorComponent()。这样就能满足要求,都可以实现高亮显示。

但不知道为什么自己实现的ComboBoxEditor 明明调用了selectAll()方法,却不高亮显示,有待拷之。。。  回复  更多评论
  

# re: 如何使可编辑的JComboBox的输入框高亮显示? 2011-04-13 14:27 zerone
我用以下方法解决了,也就是在selectAll()后调用requestFocusInWindow()即可。
textArea.requestFocusInWindow();  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: