2012-04-12 2 views
10

Мне нужно, чтобы эта программа очищала текст из текстового поля, когда мышь нажимает на это текстовое поле. Я пробовал несколько вещей, но никто из них еще не работал для меня.Как очистить 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 

    } 
} 
+1

* «Вот код целиком:« Целый »класс потребует импорта.Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

23

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

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

+0

Спасибо! Это отлично подойдило мне! –

+0

@ JimHalpert, Добро пожаловать, Джим. – user1329572

+0

@ JimHalpert, если этот ответ помог, пожалуйста [примите это] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – user1329572

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 

} 

} 
+0

подклассификация является субоптимальной, если вы надеваете Добавим действительно новую функциональность (ака: невозможно настроить по конфигурации). Предоставление публичного api, которое не предназначено для публичного использования, - это ... грех в OO-мире: _) – kleopatra

8

Вы можете просто добавить FocusListener в текстовое поле.

final JTextField textField = new JTextField("Enter text here..."); 
    textField.addFocusListener(new FocusListener(){ 
     @Override 
     public void focusGained(FocusEvent e){ 
      textField.setText(""); 
     } 
    }); 
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. Преимущества создания пользовательских один являются:

  1. я могу это напрямую реализовать MouseListener (вместо того, чтобы использовать некоторые запутанные анонимный внутренний класс)
  2. я могу сделать crapton из настроек (в том числе возможность для пользователей щелкните правой кнопкой мыши на TextField и выберите элемент из PopupMenu. // В настоящее время я работаю над настройками для копирования, вставки и перетаскивания файлов.
  3. Я могу сделать все это без переполнения основного файла .java с дополнительным кодом, который заставил бы больше материала копать позже. Хотя MikeWarren.getAnswer(this) extends richard.getAnswer(this), я думал, что я разработаю немного больше и покажу код, который я фактически использовал в одном из моих программы.
+0

1. неверно: никогда не выставляйте api, который не предназначен для общего пользования 2. Способ установки всплывающего окна без подкласса - setComponentPopupMenu, все textComponents уже имеют операции копирования/вставки/вырезания, которые могут использоваться во всплывающем окне 3. Звучит так, будто вы связываете слишком много штучек: отдельные данные из представления очистят большую часть «скопления» - в резюме: нет причины до подкласса :-) – kleopatra

0

общественный JTextField userInput;

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

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

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

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

      } 
     }); 

вы также можете попробовать с этим подходом.

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