java - JLabel - 在鼠标输入时更改为 JTextField

标签 java swing awt jlabel jtextfield

我有一个带有一些文本的 JLabel,我希望只要在其上输入鼠标,一个 JTextField 就会出现在文本的位置,以便用户可以输入一些文本。如果鼠标不在上面,它只会正常显示其文本。我使用:

JLabel jl = new JLabel("Enter mouse to make a search!")
jl.addMouseListener(new MouseAdapter()
{
     public void mouseEntered(MouseEvent evt)
     {
         JTextField textField = new JTextField(20);
         //????
     }

     public void mouseExited(MouseEvent evt)
     {
                 jl.setText("Enter mouse to make a search!");
     }
});

但是,我在如何用 jtextfield 替换 jlabel 方面遇到了一些麻烦。我怎么能那样做?

最佳答案

使用一个使用 CardLayout 的 JPanel保存 JLabel 和 JTextField,然后在需要时使用 CardLayout 的 show(...) 方法交换它们。不要忘记在 mouseExited 方法中将文本从 JTextField 传输到 JLabel。

例如:

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

class SwapPanel extends JPanel {
    private static final int COLUMNS = 20;
    public static final String LABEL = "label";
    public static final String TEXT_FIELD = "text field";
    private JLabel label = new JLabel();
    private JTextField textField = new JTextField(COLUMNS);
    private CardLayout cardLayout = new CardLayout();

    public SwapPanel() {
        setLayout(cardLayout);
        add(label, LABEL);
        add(textField, TEXT_FIELD);

        MyMouse myMouse = new MyMouse();

        label.addMouseListener(myMouse);
        textField.addMouseListener(myMouse);
    }

    private class MyMouse extends MouseAdapter {
        @Override
        public void mouseEntered(MouseEvent e) {
            cardLayout.show(SwapPanel.this, TEXT_FIELD);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            label.setText(textField.getText());
            cardLayout.show(SwapPanel.this, LABEL);
        }
    }
}

import javax.swing.*;

public class TestSwapPanel extends JPanel {
    private static final int GAP = 20;
    private SwapPanel swapPanel = new SwapPanel();

    public TestSwapPanel() {
        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        add(swapPanel);
    }

    private static void createAndShowGui() {
        TestSwapPanel mainPanel = new TestSwapPanel();

        JFrame frame = new JFrame("Swap Components");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

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

或者,如果您想在按下 enter 时切换回 JLabel,并在切换时聚焦 JTextField 并选择所有文本:

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

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

class SwapPanel2 extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final int COLUMNS = 20;
    public static final String LABEL = "label";
    public static final String TEXT_FIELD = "text field";
    private JLabel label = new JLabel();
    private JTextField textField = new JTextField(COLUMNS);
    private CardLayout cardLayout = new CardLayout();

    public SwapPanel2() {
        setLayout(cardLayout);
        add(label, LABEL);
        add(textField, TEXT_FIELD);

        MyMouse myMouse = new MyMouse();

        label.addMouseListener(myMouse);
        textField.addMouseListener(myMouse);
        textField.addActionListener(myMouse);
    }

    public void showLabel() {
        label.setText(textField.getText());
        cardLayout.show(SwapPanel2.this, LABEL);
    }

    public void showTextField() {
        textField.selectAll();
        cardLayout.show(SwapPanel2.this, TEXT_FIELD);
        textField.requestFocusInWindow();
    }

    private class MyMouse extends MouseAdapter implements ActionListener {
        @Override
        public void mouseEntered(MouseEvent e) {
            showTextField();
        }

        @Override
        public void mouseExited(MouseEvent e) {
            showLabel();
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            showLabel();
        }
    }
}

关于java - JLabel - 在鼠标输入时更改为 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417782/

相关文章:

java - 如何在 Android 应用程序中保存来自 Canvas 代码的图像?

java - 如何制作JButton图标透明,文字不透明?

java - SwingUtilities.InvokeLater 和 ButtonListeners

从 HeadlessGraphicsEnvironment.getDefaultScreenDevice 抛出的 java.awt.HeadlessException

java - 如何使用Selenium WebDriver打开手机版网站?

java - ListView 中的 Android 日期格式

Java:While循环和数组递增

java - 如何在删除某个元素后重新绘制 GUI?

java - 滚动问题(Java-JFrame-JScrollBar)

java - 使用 Java 8 在 Solaris 上无法正确呈现 Swing JButton