Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame

nilsblaumer

Mitglied
Hey Leute,
ich habe heute mal ein kleines Programm in Java geschrieben.
nen ganz einfachen "Kraftstoffrechner".

Das Problem das ich jetzt habe ist, dass ich gerne so hätte, das wenn man bei der Liter- und/oder bei der Kilometerangabe ein Buchstaben oder eine 0 einträgt, dass das Programm dann eine "Errornachricht" ausspuckt?!

Wie könnte ich das hinbekommen? :bahnhof:

Achso und wenn ich schon dabei bin, könntet ihr mir noch einen kurzen Tipp dazu geben wie ich das Icon von dem Programmfenster ändere? 😉

Errormessage.png

Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Image;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;

import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.Highlighter;


public class frame extends JFrame implements ActionListener {
	
	private JTextField liter_txt;
	private JTextField kilometer_txt;
	private JLabel copyright;
	private JButton berechnen;
	private JLabel ergebnis_lbl;
	private JLabel liter_lbl;
	private JLabel kilometer_lbl;	

	public static void main(String[] args) {
		
		frame frame = new frame("Kraftstoffrechner");
		frame.setSize(300,170);
		frame.setLayout(null);
		frame.setVisible(true);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
	}


	public frame (String title) {
		super(title);
		
		kilometer_txt = new JTextField();
		kilometer_txt.setBounds(90,10,70,30);
		kilometer_txt.setFont(new Font("Tahoma", Font.PLAIN, 17));
		add(kilometer_txt);
		kilometer_lbl = new JLabel("Kilometer:");
		kilometer_lbl.setBounds(10,10,100,30);
		kilometer_lbl.setFont(new Font("Tahoma", Font.PLAIN, 17));
		add(kilometer_lbl);
		
		liter_txt = new JTextField();
		liter_txt.setBounds(90,45,70,30);
		liter_txt.setFont(new Font("Tahoma", Font.PLAIN, 17));
		add(liter_txt);
		liter_lbl = new JLabel("Liter:");
		liter_lbl.setBounds(10,45,100,30);
		liter_lbl.setFont(new Font("Tahoma", Font.PLAIN, 17));
		add(liter_lbl);
		
		berechnen = new JButton("Berechnen");
		berechnen.setBounds(10,85,120,40);
		berechnen.setFont(new Font("Tahoma", Font.PLAIN, 17));
		add(berechnen);
		berechnen.addActionListener(this);
		berechnen.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		
		ergebnis_lbl = new JLabel("Verbrauch");
		ergebnis_lbl.setBounds(170,25,105,30);
		ergebnis_lbl.setFont(new Font("Tahoma", Font.PLAIN, 20));
		add(ergebnis_lbl);
		ergebnis_lbl.setVisible(false);
				
		copyright = new JLabel("© 2014 - Nils Blaumer");
		copyright.setBounds(155,105,120,20);
		copyright.setFont(new Font("Tahoma", Font.PLAIN, 12));
		add(copyright);
		
	}
	public void actionPerformed(ActionEvent e) {
		if (e.getSource()== berechnen) {
			double kilometer = 0;
			double liter = 0;
			double ausgabe;
			
			liter = Integer.parseInt(liter_txt.getText());
			kilometer = Integer.parseInt(kilometer_txt.getText());
			
			
			ausgabe = (liter/kilometer)*100;
			ausgabe = Math.round(ausgabe*100)/100.0;
			ergebnis_lbl.setText(ausgabe+" Liter");
			ergebnis_lbl.setVisible(true);
						
		}			
		//Copyright ©2014 - Nils Blaumer
	}

}
 

Anhänge

  • Clipboard01.png
    Clipboard01.png
    14,3 KB · Aufrufe: 29
Also das Icon kannst du mit

Java:
Image image = Toolkit.getDefaultToolkit().getImage("icon.gif");
frame.setIconImage(image)
setzen. Wobei in diesem Beispiel die icon.gif im root des Projektes liegt.

Das mit der Meldung könntest du z.b. mit einem
Java:
JOptionPane.showMessageDialog(null, "Bitte Werte groeßer 0 eingeben");
realisieren. Dies kannst du in deinem Listener nach dem einlesen der Werte machen und diese auf 0 vergleichen.

Das abfangen von Buchstaben ist dann schon eine etwas andere Sache. Aber auch nicht wirklich schwer.
Schau mal hier -> Determine if a String is an Integer in Java - Stack Overflow

Viel Erfolg mit deinem Tool
 
Zuletzt bearbeitet:
Wäre es nicht viel cooler, du würdest die Eingabe bereinigen? Das geht sehr einfach mittels RegExes:
Java:
 String bereinigt = txtfldKilom.getText().replaceAll("[^0-9]", "");

Sollen auch Dezimalstellen erlaubt sein, so wird das Ganze wesentlich länger und komlizierter aber auch nicht unmöglich.
Da würde ich dir entweder zu einem StringBuilder oder zu der Methode String#split() raten.

Die Fehlermeldung kannst du so implementieren, dass du die NumberFormatException auffängst, die Integer.parseInt(String) wirft, wenn der String sich nicht vollständig in eine Zahl umwandeln lässt.
Tut er es, testest du noch, ob der Wert 0 ist.
Der catch-Block der Exceptionfangung und der if-Block, der Aufnulltestung öffnen einen neuen JDialog mit einem Textfeld, in dem steht "Fehler: Die Zahl darf weder unter 1 sein, noch darf sie ein ungültiges Zeichen enthalten" oder so ähnlich.

Warum das nicht andersrum geht:
Testest du erst auf null, so musst du am ganzen String entlanglaufen und testen, ob jedes Zeichen '0' ist, da auch der String "0000000" von Integer.parseInt(String) in 0 geparsed wird.


Zum Icon:
Mir hat das hier geholfen, wobei Hauptframe meine main Klasse ist. Den Pfad musst du dir natürlich selber überlegen.
Java:
private void setIcon() {
	try {
		URL url = Hauptframe.class.getResource("/resourcen/Icon.png");
		icon = ImageIO.read(url);
	} catch (IOException e) {
		e.printStackTrace();
	}
	if (icon != null) this.setIconImage(icon);
}
 
Vielen Dank für die Gute und schnelle Antwort

ja Erfolg nicht, aber glückliche Menschen 😀

früher.. da hatten wir Drehscheiben für sowas... das war aber nicht digital sondern Papier oder Plastik 😉
Für solche Programme finde ich den "Berechnen" Button immer unnötig. Da du die Eingaben ja eh abfangen willst, könntest du ja auch die Textfelder mit einem Listener bestücken und die Berechnung mit jeder eingegebenen Zahl automatisch durchführen. 🙂 Nur als Idee, falls du es noch aufbohren möchtest 🙂
 
Zuletzt bearbeitet:
Das könnte ich eventuell machen, hört sich nicht schlecht an. Das Problem ist nur, das ich Einsteiger bin und das wahrscheinlich nicht kann 🙁
Könntest du mir eventuell mal schnell ein Beispielcode schreiben nur für die Listener Class?
Wäre echt nett :lol:

Bearbeitung:
Oder geht das genauso wie mit dem Button mit dem ActionListener?
 
Zuletzt bearbeitet:

Zurück
Oben