Das Auslesen und eingeben bei Textfeldern mit Zahlen in Java funktioniert nicht?

...komplette Frage anzeigen

2 Antworten

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Mainclasss extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

private JPanel cp;

private static JButton Differenz;
private static JFormattedTextField Tempoben;
private static JFormattedTextField Tempunten;
private JFormattedTextField Tempdiff;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Mainclasss frame = new Mainclasss();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public Mainclasss() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
setResizable(false);
cp = new JPanel();
cp.setBorder(new EmptyBorder(5, 5, 5, 5));
cp.setLayout(null);
setContentPane(cp);

//JLabel
JLabel label = new JLabel("Temperaturoben in °C");
label.setHorizontalAlignment(JLabel.RIGHT);
label.setBounds(20, 10, 130, 20);
cp.add(label);

JLabel label2 = new JLabel("Temperaturunten in °C");
label2.setHorizontalAlignment(JLabel.RIGHT);
label2.setBounds(22, 82, 130, 20);
cp.add(label2);

JLabel Tempdifferenz = new JLabel("Temperaturdifferenz in °C");
Tempdifferenz.setBounds(190, 33, 160, 20);
cp.add(Tempdifferenz);

//JButton
Differenz = new JButton("Berechnen");
Differenz.addActionListener(this);
Differenz.setBounds(225, 100, 100, 20);
cp.add(Differenz);

//JTextField
Tempoben = new JFormattedTextField(NumberFormat.getInstance());
cp.add(Tempoben);
Tempoben.setBounds(40, 40, 100, 30);
Tempoben.addActionListener(this);

Tempunten = new JFormattedTextField(NumberFormat.getInstance());
cp.add(Tempunten);
Tempunten.setBounds(40, 110, 100, 30);
Tempunten.addActionListener(this);

Tempdiff = new JFormattedTextField(NumberFormat.getInstance());
cp.add(Tempdiff);
Tempdiff.setBounds(225, 60, 100, 30);
Tempdiff.addActionListener(this);

}

@Override
public void actionPerformed(ActionEvent e) {

Object x = e.getSource();

int To = Integer.parseInt(Tempoben.getText());
int Tu = Integer.parseInt(Tempunten.getText());

if(x == Differenz){
Tempdiff.setText("" + (To - Tu));
}

}

}

Bitte schau dir UNBEDINGT die Java-Grundlagen noch einmal gründlich an. Insbesondere die GUI-Programmierung war komplett falsch. V.a. hast du viele Dinge getan, die nicht erforderlich waren, z.B. die Hintergrundfarbe auf weiß gesetzt, obwohl dies bereits das Default-Verhalten ist. So, wie du es gemacht hast, kann der ActionListener nicht funktionieren. Du musst ein eigenes Objekt erstellen, dessen Klasse den ActionListener implementiert. Nutze dafür bitte eine gute IDE. Eclipse, beispielsweise, macht dies automatisch für dich, wenn du ein neues JFrame erstellst.

Außerdem halte bitte Die Java-Conventions ein und schreibe die Bezeichnungen von Eigenschaften und Methoden am Anfang klein! Des Weiteren solltest du dir hier beim Layout noch mehr Mühe geben und wenigstens die einzelnen Elemente gerade platzieren.

Solltest du noch weitere Fragen haben, kannst du dich gerne melden!

Erstmal Danke.

Ich habe erst vor ein paar Tagen angefangen, hilft mir sehr.

Eine Frage noch was hat das hier für eine funktion :

public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Mainclasss frame = new Mainclasss(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }

?

tavkomann 06.07.2017, 11:41

Der komplette Swing-Prozess wird in einem eigenen Thread, dem EDT (Event Dispatching Thread), ausgeführt. Wenn das nicht so wäre, würdest du die GUI (Benutzeroberfläche) blockieren, wenn du komplexere, länger andauernde Berechnungen durchführen würdest.

Deshalb lässt du die GUI in einem weiteren Thread laufen, welcher vollständig für das Updaten der Oberfläche zuständig ist. Im Hauptthread stattfindende Berechnungen haben dann keinen Einfluss mehr auf die GUI.

Jetzt kommt EventQueue.invokeLater ins Spiel. Es fügt ein Event ans Ende der Swing-Event-List an. Es wird also dann ausgeführt, nachdem alle vorherigen GUI-Events ausgeführt wurden, also nachdem die Benutzeroberfläche initialisiert wurde.

Als Parameter übergeben wir eine anonyme Klasse, welche das Interface Runnable implementiert. Dieses erwartet die Deklaration der Methode run, welche letztendlich ausgeführt wird, sobald das jeweilige Event an der Reihe ist. Erst in dieser Methode erzeugen wir das eigentliche JFrame. Allerdings nehmen wir dafür kein pures JFrame, sondern unsere Mainclass, welche vom JFrame erbt. 

Wir erzeugen also eine neue Mainclass und setzen diese auf sichtbar. Das ganze schreiben wir in ein Try-Catch-Konstrukt. Sollte ein Fehler auftreten, wird dieser in der Konsole ausgegeben. Der weitere Code befindet sich also logischerweise im Konstruktor. In diesem findet dann das gesamte Hinzufügen von grafischen Elementen statt. Dadurch, dass wir von JFrame ableiten, wird es uns auch möglich, das Interface ActionListener zu implementieren. Dies war dein größter Fehler, denn du hattest gar kein Objekt erzeugt und wolltest trotzdem irgendwie ein Interface implementieren. Das kann natürlich nicht funktionieren.

Deshalb beachte bitte, dass du jeglichen Swing-Code in dem Swing-Thread ausführst. Also alles in den Konstruktor rein! Denn, wenn du so etwas in einem anderen Thread machst, kommt es in den meisten Fällen zu seltsamen Darstellungs-Problemen.

Es gibt da draußen zwar noch Java-Code, bei dem ein JFrame einfach vom Main-Thread aus gestartet wird. Dies wird nämlich von Swing selbst nicht unterbunden. Aber wie gesagt, führt das nur dazu, dass deine GUI oftmals einfriert.

Du musst diese paar Zeilen nicht unbedingt auswendig lernen, aber trotzdem solltest du so in etwa wissen, was sie tun. Benutze einfach eine moderne IDE wie Eclipse oder IntelliJ, die diese Arbeit für dich abnimmt.

0

Was möchtest Du wissen?