2015-09-05 3 views
1

У меня есть JLabel с некоторым текстом, и я бы хотел, чтобы сразу же после ввода мыши на нем появился JTextField, чтобы он появился на месте текста, чтобы пользователь мог ввести некоторые текст. Если мышь не находится на нем, он просто отображает текст как обычно. Я использую:JLabel - On Mouse Введенное изменение на 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!"); 
    } 
}); 

Однако, у меня возникли некоторые проблемы о том, как заменить JLabel с JTextField. Как я мог это сделать?

ответ

3

Используйте JPanel, который использует CardLayout для хранения как JLabel, так и JTextField, а затем поменяйте их с помощью метода CardLayout show(...), если это необходимо. Не забудьте передать текст из JTextField в JLabel в методе mouseExited.

Например:

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(); 
      } 
     }); 
    } 
} 

Или, если вы хотите поменять обратно 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(); 
     } 
    } 
} 
+0

Именно то, что я хотел! Это очень много для вашего времени! – darkchampionz

Смежные вопросы