Textfelder

H3llGhost

Mitglied
Hallo Leute,

ich habe mit folgendem Code:

Code:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Wirkungsgrad extends JFrame implements ActionListener
{
   private JButton berechneButton;
   private JButton exitButton;
   private JPanel einPanel;
   private JTextField zahl;
   private JTextField zahl2;
   private Berechne berechne;
   // Konstruktor, alles was man für die Initialisierung benötigt hier hinein!!
   public Wirkungsgrad()
   {
     setTitle("Wirkungsgrad");
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
     setSize(d.width, d.height); // Größe des Rahmens in Pixel
     setDefaultCloseOperation(EXIT_ON_CLOSE); // Schließt den Rahmen
     
     berechne = new Berechne();
     
     einPanel = new JPanel();  // Erzeugung der "Leinwand" für die Komponenten
     einPanel.setLayout(null); // Keinen Layoutmanager verwenden
     einPanel.setBackground(Color.BLACK);
     
     berechneButton = new JButton("Berechnen");  // Erzeugung des Buttons
     int x = (d.width-370);
     int y = (d.height-80);
     berechneButton.setBounds(x, y, 140, 30);
     berechneButton.addActionListener(this); // this ist eine Referenz auf die eigene Klasse
     
     exitButton = new JButton("Exit");  // Erzeugung des Buttons
     x = (d.width-180);
     y = (d.height-80);
     exitButton.setBounds(x, y, 140, 30);
     exitButton.addActionListener(this);
     
     zahl = new JTextField("Hier bitte ... eingeben", 10);
     zahl.setEditable(true);
     zahl.setBounds(30, 60, 200, 30);

     x = (d.width-240);
     y = (d.height-130);
     zahl2 = new JTextField("Hier bitte ... eingeben", 10);
     zahl2.setEditable(true);
     zahl2.setBounds(x, y, 200, 30);

     einPanel.add(berechneButton);           // den Button auf die "Leinwand" packen
     einPanel.add(exitButton);
     einPanel.add(zahl);
     einPanel.add(zahl2);

     // ganz zum Schluss!!
     add(einPanel);
     setVisible(true); // Zum Schluss das ganze sichtbar machen
     setResizable(false);
   }
   public static void main(String args[])
   {
     Wirkungsgrad fe = new Wirkungsgrad();
   }
   public void actionPerformed(ActionEvent evt)
   {
     Object quelle = evt.getSource();
     if(quelle == berechneButton)
     {
      berechne.berechne(zahl, zahl2);
     }
     if(quelle == exitButton)
     {
      dispose();
     }
   }
}

Ein kleines bzw. großes Fenster gemacht ... ;)
Nun möchte ich, wenn man in das Feld zahl bzw. zahl2 klickt, dass der Text von dort verschwindet.
Das wäre mein erstes Anliegen.

Mein zweites und auch das wichtigere ist:
Wenn ich auf berechnen klicke soll er ja die Variablen zahl und zahl2 übergeben.
Nun muss ich aber vorher überprüfen, ob die Variablen wirklich double Werte sind!
Wenn nicht soll der einen Fehler ausgeben.
Aber wie mache ich das?!
 
1. Neben dem Interface ActionListener kannst du das Interface FocusListener mit den abstrakten Methoden focusGained(FocusEvent e) und focusLost(FocusEvent e) implementieren.

2.
Java:
try { double d = Double.parseDouble("string"); }
catch(NumberFormatException e) { System.out.println(e.getMessage()); }
 
Danke für den Tipp!
Habe es nun so gemacht:

Code:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Wirkungsgrad extends JFrame implements ActionListener
{
   private JButton berechneButton;
   private JButton exitButton;
   private JPanel einPanel;
   private JTextField zahl;
   private JTextField zahl2;
   private Berechne berechne;
   private String ztext;
   private String z2text;
   // Konstruktor, alles was man für die Initialisierung benötigt hier hinein!!
   public Wirkungsgrad()
   {
     ztext = "Hier bitte ... eingeben";
     z2text = "Hier bitte ... eingeben";

     setTitle("Wirkungsgrad");
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
     setSize(d.width, d.height); // Größe des Rahmens in Pixel
     setDefaultCloseOperation(EXIT_ON_CLOSE); // Schließt den Rahmen

     berechne = new Berechne();
     
     einPanel = new JPanel();  // Erzeugung der "Leinwand" für die Komponenten
     einPanel.setLayout(null); // Keinen Layoutmanager verwenden
     einPanel.setBackground(Color.BLACK);
     
     berechneButton = new JButton("Berechnen");  // Erzeugung des Buttons
     int x = (d.width-370);
     int y = (d.height-80);
     berechneButton.setBounds(x, y, 140, 30);
     berechneButton.addActionListener(this); // this ist eine Referenz auf die eigene Klasse
     
     exitButton = new JButton("Exit");  // Erzeugung des Buttons
     x = (d.width-180);
     y = (d.height-80);
     exitButton.setBounds(x, y, 140, 30);
     exitButton.addActionListener(this);
     
     zahl = new JTextField(ztext, 10);
     zahl.setDocument(new NegativeDoubleDocument());
     zahl.setEditable(true);
     zahl.setBounds(30, 60, 200, 30);
     zahl.addFocusListener(new FocusAdapter() {
      public void focusGained(FocusEvent e) {
       if(!e.isTemporary() && zahl.getText().equals(ztext)) {
         zahl.setText("");
         zahl.setForeground(UIManager.getColor("zahl.foreground"));
       }
      }
      public void focusLost(FocusEvent e)  {
       if(!e.isTemporary() && zahl.getText().trim().length() == 0) {
         zahl.setForeground(Color.LIGHT_GRAY);
         zahl.setText(ztext);
       }
      }
     });

     x = (d.width-240);
     y = (d.height-130);
     zahl2 = new JTextField(z2text, 10);
     zahl2.setDocument(new NegativeDoubleDocument());
     zahl2.setEditable(true);
     zahl2.setBounds(x, y, 200, 30);
     zahl2.addFocusListener(new FocusAdapter() {
      public void focusGained(FocusEvent e) {
       if(!e.isTemporary() && zahl2.getText().equals(z2text)) {
         zahl2.setText("");
         zahl2.setForeground(UIManager.getColor(z2text));
       }
      }
      public void focusLost(FocusEvent e)  {
       if(!e.isTemporary() && zahl2.getText().trim().length() == 0) {
         zahl2.setForeground(Color.LIGHT_GRAY);
         zahl2.setText(z2text);
       }
      }
     });

     einPanel.add(berechneButton);           // den Button auf die "Leinwand" packen
     einPanel.add(exitButton);
     einPanel.add(zahl);
     einPanel.add(zahl2);

     // ganz zum Schluss!!
     add(einPanel);
     setVisible(true); // Zum Schluss das ganze sichtbar machen
     setResizable(false);
   }
   public static void main(String args[])
   {
     Wirkungsgrad fe = new Wirkungsgrad();
   }
   public void actionPerformed(ActionEvent evt)
   {
     Object quelle = evt.getSource();
     if(quelle == berechneButton)
     {
      Berechne.berechne(Double.parseDouble(zahl.getText()), Double.parseDouble(zahl2.getText()));
     }
     if(quelle == exitButton)
     {
      dispose();
     }
   }
}

Mein Problem ist nun, dass er immer im Textfeld zahl startet.
Wie kann ich das verhindern?
Und wenn ich irgendwo hinklicke springt der Cursor nicht aus dem Textfeld, erst wenn ich in das andere Textfeld oder auf die Buttons klicke.
Warum?
 
Zurück