簡體   English   中英

JLabel - On Mouse輸入對JTextField的更改

[英]JLabel - On Mouse Entered change to 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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM