【问题标题】:JLabel - On Mouse Entered change to a JTextFieldJLabel - 在鼠标输入时更改为 JTextField
【发布时间】:2015-12-02 04:33:11
【问题描述】:

我有一个带有文本“输入鼠标”的 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“输入鼠标”上时,它与 JTextField 之间出现了一些错误/闪烁。为什么会这样,我能做些什么来解决它?类型

【问题讨论】:

  • 我会用 true / false 切换到 JTextField.setEnabled 而不是 CardLayout

标签: java swing awt jlabel jtextfield


【解决方案1】:

这是因为当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");
        }
    });

【讨论】:

  • 该死,我迟到了 4 秒 :D
【解决方案2】:

即使它没有出现故障,它也不会起作用,因为文本字段大于标签,并且您只需将侦听器添加到标签。出现故障是因为只显示文本字段,因此它会触发标签上的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();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    相关资源
    最近更新 更多