Вопрос по java, swing – Как очистить JTextField, когда мышь щелкает JTextField

10

Мне нужно, чтобы эта программа очищала текст от текстового поля, когда щелкала мышью в этом текстовом поле. Я попробовал несколько вещей, но ни одна из них еще не работала на меня.

Вот код в полном объеме:

<code>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

    }
}
</code>
* & quot; Вот код в полном объеме: & quot; «Весь» класс будет нуждаться в импорте. Для лучшей помощи, отправьтеSSCCE. Andrew Thompson

Ваш Ответ

7   ответов
9

FocusListener в текстовое поле.

 final JTextField textField = new JTextField("Enter text here...");
    textField.addFocusListener(new FocusListener(){
        @Override
        public void focusGained(FocusEvent e){
            textField.setText("");
        }
    });
Это наиболее подходящий ответ, когда текстовое поле не отключено. Обратите внимание, что вам также необходимо предоставить переопределение дляfocusLost сделать действительнымFocusListener.
0

сразу после исполнения текста:

userInput.setText (& Quot; & Quot;); // пусто

Это должно сделать.

0
 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) {

            }
        });

25

Во всяком случае, регистрацияMouseAdapter и переопределениеmouseClicked работал на меня,

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

Я надеюсь, что этот пример поможет вам начать в правильном направлении!

@JimHalpert, если этот ответ помог, пожалуйстаaccept it
Хотя я думаюaddFocusListener подход, как правило, лучше, этот метод имеет преимущество работы с ven, когда текстовое поле отключено.
@JimHalpert, Добро пожаловать, Джим.
Спасибо! Это отлично сработало для меня! Joshua Vaughan
2

Я думаю, это то, что вы пытаетесь сделать ...

textField.addMouseListener(new MouseAdapter())
    {
        public void mouseClicked(MouseEvent e)
        {
            if(textField.getText().equals("Default Text"))
            {
                textField.setText("");
                repaint();
                revalidate();
            }           
        }
    });
0

что я сделал, было просто сделать заказJTextField, Что-то вроде:

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

В этом пользовательском TextField я просто использовалMouseListener, Преимущества создания индивидуального:

I can have it directly implement MouseListener (instead of having to use some confusing anonymous inner class) I can make a crapton of customizations (including the option for users to right-click the TextField and select an item from a PopupMenu. //I am currently working on options for users to copy, paste, and drag-and-drop. I can do all this without crowding the main .java file with extra code that would make for more stuff to dig through later. Although MikeWarren.getAnswer(this) extends richard.getAnswer(this), I thought I would elaborate a little more and show some code I actually used in one of my programs.
1. неверно: никогда не раскрывайте API, который не предназначен для публичного использования. 2. способ установки всплывающего окна без подклассов - setComponentPopupMenu, у всех textComponents уже есть действия копирования / вставки / вырезания, которые можно использовать во всплывающем окне 3. звучит как вы связываете слишком много штук: выделение данных из представления очистит большую часть "краудинга" - в итоге: пока нет оснований для подкласса :-)
3

текст очищается при нажатии, и вы можете ввести новый текст. Чтобы снова очистить текст с помощью щелчка, текстовое поле должно потерять фокус, а затем восстановить фокус с помощью мыши. Я не совсем уверен, что вы ищете здесь.

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

}

}
создание подклассов является субоптимальным, если вы не добавляете действительно новую функциональность (иначе: недоступно для конфигурации). Разоблачение публичного API, которое не предназначено для публичного использования, является грехом в мире OO: _)

Похожие вопросы