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
}
}
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!
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("");
}
});
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
}
}
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();
}
}
});
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.
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:
.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.public JTextField userInput;
juste après l'exécution du texte:
userInput.setText (""); // vide
Cela devrait faire.