web-dev-qa-db-fra.com

Comment effacer JTextField lorsque la souris clique sur JTextField

Je dois faire en sorte que ce programme efface le texte du champ de texte lorsque la souris clique dessus. J'ai essayé plusieurs choses, mais aucune d'entre elles n'a encore fonctionné pour moi.

Voici le code dans son intégralité:

public class TimerClassPanel extends JFrame implements MouseListener{

    public TimerClassPanel(){
        setTitle("Timer Class");
        setSize(WIDTH, HEIGHT);

        timer = new Timer(DELAY, new TimerEventHandler());

        pane = getContentPane();
        pane.setLayout(null);

        int r = (int)(9.0 * Math.random()) + 1;
        String str2 = Integer.toString(r);

        label = new JLabel(str2, SwingConstants.CENTER);
        label.setSize(150,30);
        label.setLocation(0,0);

        textField = new JTextField();
        textField.setSize(150,30);
        textField.setLocation(150,0);

        startB = new JButton("Start");
        startbh = new StartButtonHandler();
        startB.addActionListener(startbh);
        startB.setSize(100,30);
        startB.setLocation(0,30);

        stopB = new JButton("Stop");
        stopbh = new StopButtonHandler();
        stopB.addActionListener(stopbh);
        stopB.setSize(100,30);
        stopB.setLocation(100,30);

        exitB = new JButton("Exit");
        ebHandler = new ExitButtonHandler();
        exitB.addActionListener(ebHandler);
        exitB.setSize(100,30);
        exitB.setLocation(200,30);      

        pane.add(label);

        pane.add(textField);
        pane.add(startB);
        pane.add(stopB);
        pane.add(exitB);

        timer = new Timer(DELAY, new TimerEventHandler());

        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private class TimerEventHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            int r = (int)(9.0 * Math.random()) + 1;
            String str = Integer.toString(r);
            currentNum = "";
            currentNum = str;
            label.setText(str);
            repaint();
        }
    }

    public class StartButtonHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            timer.start();
        }
    }

    public class StopButtonHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            timer.stop();
        }
    }

    private class ExitButtonHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            System.exit(0);
        }
    }

    public static void main(String[] args){
        TimerClassPanel timerPanel = new TimerClassPanel();
        JOptionPane.showMessageDialog(null, "Type your guess (int between 1-9)" +
                " in the field then press 'ENTER'");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if( e.getX() > 150 && e.getX() < 300 && e.getY() > 0 && e.getY() < 30)
        {   
            textField.setText("");
            repaint();
        }
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
}
10
Joshua Vaughan

TL; DR

Quoi qu’il en soit, enregistrer une MouseAdapter et remplacer mouseClicked a fonctionné pour moi,

import Java.awt.FlowLayout;
import Java.awt.event.MouseAdapter;
import Java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class ClickAndClearDemo {
    private static void createAndShowGUI(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));

        final JTextField textField = new JTextField("Enter text here...");
        textField.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e){
                textField.setText("");
            }
        });

        frame.add(textField);
        frame.pack();
        frame.setVisible(true);
    }

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

J'espère que cet exemple vous permettra de commencer dans la bonne direction!

25
user1329572

Vous pouvez simplement ajouter une FocusListener au champ de texte.

 final JTextField textField = new JTextField("Enter text here...");
    textField.addFocusListener(new FocusListener(){
        @Override
        public void focusGained(FocusEvent e){
            textField.setText("");
        }
    });
9
user973999

Cela a fonctionné pour moi. Bien sûr, le texte est effacé lorsque vous cliquez sur et vous pouvez entrer un nouveau texte. Pour effacer le texte à nouveau par un clic, le champ de texte doit perdre le focus, puis le reprendre à la souris. Je ne suis pas tout à fait sûr de ce que vous recherchez ici. 

import Java.awt.event.MouseEvent;
import Java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class ClickTextField extends JTextField implements MouseListener{

public static void main(String[] args) {
    new ClickTextField();
}

public ClickTextField() {
    addMouseListener(this);

    JFrame J = new JFrame();
    J.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    J.setSize(100,100);
    J.getContentPane().add(this);
    setText("Texty text...");
    J.show();
}

@Override
public void mouseClicked(MouseEvent e) {

    setText("");

}

@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

}
3
richard

Est-ce pour effacer le texte "indice"?

Je pense que c'est ce que vous essayez de faire ...

textField.addMouseListener(new MouseAdapter())
    {
        public void mouseClicked(MouseEvent e)
        {
            if(textField.getText().equals("Default Text"))
            {
                textField.setText("");
                repaint();
                revalidate();
            }           
        }
    });
2
Aezur
 jTextField2.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton()==1) {
                    jTextField2.setText("");
                }//3 = for right click 
                //2 for middlemouse
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        });

vous pouvez aussi essayer avec cette approche. 

0
Priyamal

Je devais le faire aussi. Ce que j'ai fait était simplement de créer une coutume JTextField. Quelque chose comme:

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;

import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.awt.event.MouseEvent;
import Java.awt.event.MouseListener;

@SuppressWarnings("serial")
public class InputField extends JTextField implements MouseListener,ActionListener
{
public InputField(String text) 
{
    super(text);
    super.setHorizontalAlignment(RIGHT);
    super.addMouseListener(this);
}

@Override
public void mouseClicked(MouseEvent e) 
{
    // TODO Auto-generated method stub
    if (getText().equals("0.0"))
    {
        setText("");
    }
}

@Override
public void mouseEntered(MouseEvent e) 
{

}

@Override
public void mouseExited(MouseEvent e)
{

}

@Override
public void mousePressed(MouseEvent e) {
    maybeShowPopup(e);
    // if the mouse is pressed and "0.0" is the text, we erase the text
    if (getText().equals("0.0"))
    {
        setText("");
    }
}

@Override
public void mouseReleased(MouseEvent e) 
{
    maybeShowPopup(e);
}

private void maybeShowPopup(MouseEvent event)
{
    //if the user clicked the right mouse button
    if (javax.swing.SwingUtilities.isRightMouseButton(event))
    {
        //create (and show) the popup
        createPopup().show(event.getComponent(), event.getX(), event.getY());
    }
}

private JPopupMenu createPopup()
{
    JPopupMenu popupMenu = new JPopupMenu();
    //add the clearTextOption to the JPopupMenu
    JMenuItem clearTextOption = new JMenuItem("Clear text");
    clearTextOption.addActionListener(this);
    popupMenu.add(clearTextOption);
    return popupMenu;
}

@Override
public void actionPerformed(ActionEvent arg0) {
    //clear the TextField
    setText("");
}

} //end custom TextField

Dans ce TextField personnalisé, j'ai simplement utilisé une MouseListener. Les avantages de la personnalisation sont:

  1. Je peux le faire implémenter directement MouseListener (au lieu d'avoir à utiliser une classe interne anonyme déroutante)
  2. Je peux créer un tas de personnalisations (y compris la possibilité pour les utilisateurs de cliquer avec le bouton droit de la souris sur le champ TextField et de sélectionner un élément dans un PopupMenu. // Je travaille actuellement sur des options permettant aux utilisateurs de copier, coller et glisser-déposer.
  3. Je peux faire tout cela sans encombrer le fichier principal .Java avec un code supplémentaire qui permettrait de creuser davantage de choses ultérieurement. Bien que MikeWarren.getAnswer(this) extends richard.getAnswer(this), j’ai pensé élaborer un peu plus et montrer du code que j’ai utilisé dans l’un de mes programmes.
0
Mike Warren

public JTextField userInput;

juste après l'exécution du texte:

userInput.setText (""); // vide

Cela devrait faire.

0
user6227985