2012-04-12 45 views
10

Ich muss dieses Programm den Text aus dem Textfeld löschen, wenn die Maus in dieses Textfeld klickt. Ich habe ein paar Dinge ausprobiert, aber keiner von ihnen muss noch für mich arbeiten. HierSo löschen Sie JTextField, wenn Sie auf das JTextField klicken

ist der Code in seiner Gesamtheit:

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

* "Hier ist der Code in seiner Gesamtheit:" Die 'gesamte' Klasse würde Importe benötigen.Um schneller Hilfe zu bekommen, schreiben Sie eine [SSCCE] (http://sscce.org/). –

Antwort

23

TL; DR

Wie dem auch sei, die Registrierung ein MouseAdapter und übergeordnete mouseClicked für mich gearbeitet,

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

Ich hoffe, dieses Beispiel wird Du bist in die richtige Richtung gestartet!

+0

Danke! Das hat super für mich funktioniert !! –

+0

@ JimHalpert, Gern geschehen, Jim. – user1329572

+0

@JimHalpert, Wenn diese Antwort geholfen hat, bitte [akzeptieren] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – user1329572

3

Das funktionierte für mich. Der Text wird natürlich gelöscht, wenn Sie auf klicken, und Sie können neuen Text eingeben. Um den Text erneut durch einen Klick zu löschen, muss das Textfeld den Fokus verlieren und dann den Fokus von der Maus wieder erlangen. Ich bin mir nicht ganz sicher, wonach du hier suchst.

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

Unterklasse ist suboptimal, wenn Sie nicht füge keine wirklich neue Funktionalität hinzu (aka: nicht erreichbar durch Konfiguration). Öffentliches API zu veröffentlichen, das nicht öffentlich verwendet werden soll, ist ... eine Sünde in OO-world: _) – kleopatra

8

können Sie einfach einen FocusListener auf das Textfeld hinzuzufügen.

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

Ist es um den Hinweistext zu löschen?

Ich denke, das ist, was Sie versuchen ...

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

zu tun hatte ich dies auch zu tun. Was ich gemacht habe, war einfach eine Gewohnheit JTextField zu machen. Etwas wie:

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 

In diesem kundenspezifischen TextField-, habe ich einfach ein MouseListener verwendet. Die Vorteile der Herstellung eines benutzerdefinierten eins sind:

  1. Ich habe kann es Mouselistener direkt implementieren (statt etwas verwirrend anonyme innere Klasse verwenden)
  2. ich eine crapton von Anpassungen vornehmen können (einschließlich der Option für Benutzer Klicken Sie mit der rechten Maustaste auf das TextField und wählen Sie ein Element aus einem PopupMenu. // Ich arbeite gerade an Optionen für Benutzer zum Kopieren, Einfügen und Ziehen und Ablegen.
  3. Ich kann das alles tun, ohne die Hauptdatei .java zu überladen mit extra Code, der später mehr Sachen zum Durchgraben bringen würde.Obwohl MikeWarren.getAnswer(this) extends richard.getAnswer(this), dachte ich, ich würde ein wenig mehr ausarbeiten und Code zeigen, den ich tatsächlich in einem meiner benutzt habe Programme.
+0

1. ist falsch: stelle niemals api zur Verfügung, das nicht für die öffentliche Nutzung bestimmt ist 2. Die Methode zur Installation eines Popups ohne Subclassing ist setComponentPopupMenu, alle textComponents haben bereits copy/paste/cut-Aktionen, die in einem Popup 3 verwendet werden können. Klingt so, als würden Sie zu viele Dinge koppeln: die Daten aus der View herauszureißen wird den Großteil des "Crowding" bereinigen - zusammenfassend: kein Grund zur Unterklasse bisher :-) – kleopatra

0

public JTextField userInput;

direkt nach der Ausführung des Textes:

userInput.setText (""); // leer

Dies sollte tun.

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

      } 
     }); 

können Sie auch mit diesem Ansatz versuchen.