web-dev-qa-db-ja.com

マウスがJTextFieldをクリックしたときにJTextFieldをクリアする方法

このプログラムで、テキストフィールドをマウスでクリックしたときに、テキストフィールドからテキストをクリアする必要があります。私はいくつかのことを試しましたが、どれもまだ私のために働いていません。

以下にコード全体を示します。

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

    }
}
11
Joshua Vaughan

TL; DR

とにかく、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();
            }
        });
    }
}

この例が正しい方向に進むことを願っています!

26
user1329572

FocusListenerをテキストフィールドに追加するだけです。

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

これでうまくいきました。もちろん、クリックするとテキストがクリアされ、新しいテキストを入力できます。クリックしてテキストを再度クリアするには、テキストフィールドがフォーカスを失ってから、マウスからフォーカスを取り戻す必要があります。ここで何を探しているのか、完全にはわかりません。

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

「ヒント」テキストをクリアすることですか?

これはあなたがやろうとしていることだと思います...

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

            }
        });

あなたもこのアプローチで試すことができます。

0
Priyamal

私もこれをしなければなりませんでした。私がしたことは単にカスタム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を使用しました。カスタムのものを作ることの利点は次のとおりです。

  1. (紛らわしい匿名の内部クラスを使用する代わりに)MouseListenerを直接実装することができます。
  2. カスタマイズの細かい部分を作成できます(ユーザーがTextFieldを右クリックしてPopupMenuから項目を選択するためのオプションを含みます。//現在、ユーザーがコピー、貼り付け、およびドラッグアンドドロップするためのオプションに取り組んでいます。
  3. メインの_.Java_ファイルを後で掘り下げるための追加のコードで混雑させることなく、これらすべてを行うことができます。 MikeWarren.getAnswer(this) extends richard.getAnswer(this)ですが、もう少し詳しく説明して、自分のプログラムの1つで実際に使用したコードをいくつか示したいと思いました。
0
Mike Warren

public JTextField userInput;

テキストを実行した直後:

userInput.setText( ""); // 空の

これで十分です。

0
user6227985