我想自定义一个控件,当鼠标点击该控件时会出来输入框,输入文字后敲回车或鼠标点其他地方,该控件就显示刚输入的文字,请问怎么实现,谢谢!

解决方案 »

  1.   

    补充一下:当鼠标点击该控件时,该控件会出来输入框,当输完后该控件又显示文字,即这个控件在JTextField和JLabel之间切换
      

  2.   

    那也简单么,给Label加一个点击事件,点击后隐藏Lable并显示text,然后text添加失去焦点事件与键盘敲击事件,事件内容其余于上相同,不同的知识添加一个隐藏text再显示Lable的功能。
      

  3.   

    使用CardLayout切换JLabel/JTextField,JLabel处理鼠标点击切换到JTextField
    JTextField处理回车按下和失去焦点切换到JLabel
      

  4.   

    我实现了一下发现有些问题,我是把JTextField加入到JLabel当中了,当我点击JLabel后setVisible(false),此时整个JLabel消失了,JTextField就显示不出来了
      

  5.   

    这个类似于JList/JTable的 Renderer/Editor,可以参考一下JList的实现。
      

  6.   

    试试这个例子.....还需要改善很多import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;import javax.swing.*; public class 控件切换测试 {
     JFrame frame =new JFrame ("控件切换测试");
     JPanel panel=new JPanel();
     
     static JTextField txtField=new JTextField(7);
     static JLabel lblLabel =new JLabel("        ",JLabel.LEFT);
     JLabel infoLabel=new JLabel("姓名:");
     
     控件切换测试(){
     
     panel.setLayout(new FlowLayout());
     panel.add(infoLabel);
     panel.add(txtField);
     panel.add(lblLabel);
     
     txtField.setVisible(false);
    // txtField.setVisible(true);
     
     txtField.addMouseListener( new MouseTestListener());
     lblLabel.setVisible(true);
     lblLabel.addMouseListener(new MouseTestListener());
     
    // BorderLayout borderLAY=new BorderLayout();
    // frame.setLayout(borderLAY);
    // frame.add(panel,borderLAY.CENTER);
     
     frame.add(panel);
     frame.setVisible(true);
     frame.setSize(400, 300);
     frame.setLocationRelativeTo(null);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
     }
     public static void main(String a[]){
     new 控件切换测试();
     }
     }
     
     class MouseTestListener implements  MouseListener {
     
     public void mouseEntered(MouseEvent e) {
     
     if (e.getSource()==控件切换测试.txtField){
     System.out.println("鼠标进入了文本框!");
     
     控件切换测试.lblLabel.setVisible(false);
     控件切换测试.txtField.setVisible(true);
     }else if(e.getSource()==控件切换测试.lblLabel){
     System.out.println("鼠标进入了标签!");
     
     控件切换测试.lblLabel.setVisible(false);
     控件切换测试.txtField.setVisible(true);
     }
      }
     
     public void mouseExited(MouseEvent e) {
     
     if (e.getSource()==控件切换测试.txtField){
     System.out.println("鼠标离开了文本框!");
     
     控件切换测试.lblLabel.setVisible(true);
     
     if(控件切换测试.txtField.getText().trim().equals("")){
     控件切换测试.lblLabel.setText("     ");  //如果文本框为空,要把Label的文本设置成几个空格,不然就不能再监听鼠标事件了
     }else{
     控件切换测试.lblLabel.setText( 控件切换测试.txtField.getText());
     }
     
     控件切换测试.txtField.setVisible(false);
     
     
     }else if(e.getSource()==控件切换测试.lblLabel){
     System.out.println("鼠标离开了标签!");
     
     控件切换测试.lblLabel.setVisible(true);
      
     if(控件切换测试.txtField.getText().trim().equals("")){
     控件切换测试.lblLabel.setText("     ");//如果文本框为空,要把Label的文本设置成几个空格,不然就不能再监听鼠标事件了
     }else{
     控件切换测试.lblLabel.setText( 控件切换测试.txtField.getText() );
     }
     
     控件切换测试.txtField.setVisible(false);
     } } public void mouseClicked(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e) {
    }
    public void mouseReleased(MouseEvent e) {
    }
     
     
     }