2015-09-06 77 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,「英雄所見略同」 :-) –