2015-09-06 70 views
1

我有一个带有文本“输入鼠标”的JLabel。只要用户在它上面输入鼠标,我想要出现一个JTextField,以便用户可以搜索一些东西。如果鼠标被移除,则以前的JLabel必须再次出现。我使用:JLabel - 鼠标输入到JTextField的更改

import java.awt.CardLayout; 

import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class ML extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public ML() { 
     GridLayout gl = new GridLayout(1, 2); 
     setLayout(gl); 

     JPanel jp = new JPanel(); 
     CardLayout cl = new CardLayout(); 
     jp.setLayout(cl); 

     JPanel jp1 = new JPanel(); 
     JLabel jl = new JLabel("Enter mouse!"); 
     jp1.add(jl); 

     JPanel jp2 = new JPanel(); 
     JTextField jtf = new JTextField(20); 
     jp2.add(jtf); 

     jp.add(jp1, "1"); 
     jp.add(jp2, "2"); 
     cl.show(jp, "1"); 


     jp.addMouseListener(new MouseAdapter() 
     { 
      public void mouseEntered(MouseEvent evt) 
      { 
       cl.show(jp, "2"); 
      } 
      public void mouseExited(MouseEvent evt) 
      { 
       cl.show(jp, "1"); 
      } 
     }); 

     add(jp); 

     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 

    } 


    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ML(); 
      } 
     }); 
    }} 

一切工作就好了,但是当我将鼠标悬停在一个JLabel“进入鼠标”,它有点错误/这和JTextField中之间闪烁。为什么是这样,我能做些什么来解决它? Ty

+0

我会用,用真/假以JTextField.setEnabled而不是CardLayout – mKorbel

回答

3

即使没有毛刺,它不会工作,因为文本框比标签大,而你却只是监听器添加到标签。毛刺是由于仅显示文本字段而引起的,因此会触发标签上的mouseExited事件。要解决此问题,您需要标签上的mouseEntered事件只有,但文本字段上的mouseExited事件只有

import java.awt.CardLayout; 

import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class ML extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public ML() { 
     GridLayout gl = new GridLayout(1, 2); 
     setLayout(gl); 

     JPanel jp = new JPanel(); 
     CardLayout cl = new CardLayout(); 
     jp.setLayout(cl); 

     JPanel jp1 = new JPanel(); 
     JLabel jl = new JLabel("Enter mouse!"); 
     jp1.add(jl); 

     JPanel jp2 = new JPanel(); 
     JTextField jtf = new JTextField(20); 
     jp2.add(jtf); 

     jp.add(jp1, "1"); 
     jp.add(jp2, "2"); 
     cl.show(jp, "1"); 

     jl.addMouseListener(new MouseAdapter() { 
      public void mouseEntered(MouseEvent evt) { 
       cl.show(jp, "2"); 
      } 
     }); 

     jtf.addMouseListener(new MouseAdapter() { 
      public void mouseExited(MouseEvent evt) { 
       cl.show(jp, "1"); 
      } 
     }); 

     add(jp); 

     this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ML(); 
      } 
     }); 
    } 
} 
3

这是因为当显示JTextField时,立即调用mouseExited()方法。当然,JLabel会再次显示,并且在您继续移动鼠标时会循环。

以下工作:

jl.addMouseListener(new MouseAdapter() { 
     public void mouseEntered(MouseEvent evt) { 
      cl.show(jp, "2"); 
     } 
    }); 

    jtf.addMouseListener(new MouseAdapter() { 
     public void mouseExited(MouseEvent evt) { 
      cl.show(jp, "1"); 
     } 
    }); 
+0

该死的切换,我为4秒为时已晚:d –

+0

@LuxxMiner,“英雄所见略同” :-) –