JLabel - 在鼠标输入时更改为 JTextField
JLabel - On Mouse Entered change to a JTextField
我有一个带有文本 "Enter mouse" 的 JLabel。一旦用户在其上输入鼠标,我希望出现一个 JTextField,以便用户可以搜索一些内容。如果移除鼠标,则必须再次出现之前的 JLabel。我使用:
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 "Enter mouse" 上时,它与 JTextField 之间有些 bugs/blinks。为什么会这样,我该怎么做才能解决它?泰
那是因为当显示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");
}
});
即使没有故障,它也不会工作,因为文本字段比标签大,而且您只将侦听器添加到标签。导致故障的原因是仅显示了文本字段,因此它触发了标签上的 mouseExited
事件。要解决此问题,您需要标签上的 mouseEntered
事件 only,但文本字段上的 mouseExited
事件 only。
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();
}
});
}
}
我有一个带有文本 "Enter mouse" 的 JLabel。一旦用户在其上输入鼠标,我希望出现一个 JTextField,以便用户可以搜索一些内容。如果移除鼠标,则必须再次出现之前的 JLabel。我使用:
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 "Enter mouse" 上时,它与 JTextField 之间有些 bugs/blinks。为什么会这样,我该怎么做才能解决它?泰
那是因为当显示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");
}
});
即使没有故障,它也不会工作,因为文本字段比标签大,而且您只将侦听器添加到标签。导致故障的原因是仅显示了文本字段,因此它触发了标签上的 mouseExited
事件。要解决此问题,您需要标签上的 mouseEntered
事件 only,但文本字段上的 mouseExited
事件 only。
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();
}
});
}
}