dafür sorgen, dass im JTextfield nur zahlen eingebbar sind

mhmt_03

Mitglied
Hallo und guten abend, ich habe derzeit ein problem mit meinen aufgaben: und zwar soll ich als hausaufgabe eine gui zur medienverwaltung herstellen, aber ich möchte, dass wenn man sein eigenes medium erstellt, dass man bei der spielzeit nur zahlen eingeben kann. ich habe im internet schon gesucht aber nicht wirklich nachvollziehen können, wie man das schließlich macht. ich habe dafür extra ein jtextfield erstellt und es zahlen genannt. dieses werde ich dann wenns funktioniert einfach visible true oder eben false machen.
ps: ich weiß das einige der verwendeten methoden nicht effizient sind, aber das ist halt leider das, was ich in der schule gelernt habe. und wie ihr merken werdet ist das programm nicht fertig.

vielen dank für eure hilfen.
 

Anhänge

(mein quelltext wusste nicht wie das mit in die frage soll)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class GUI implements ActionListener {
String x;
int y;

EigenesMedium eigenesmedium = new EigenesMedium();
private JFrame window = new JFrame("GUI für vererbung");
//Eine Schaltfläche zum Anklicken
private JButton knopf1 = new JButton("DVD");
private JButton knopf1E = new JButton("DVD Ergänzung");
private JButton knopf2 = new JButton("CD");
private JButton knopf2E = new JButton("CD Ergänzung");
private JButton knopf3 = new JButton("Videospiel");
private JButton knopf3E = new JButton("Videospiel Ergänzung");
private JButton knopf4 = new JButton("Brettspiel");
private JButton knopf4E = new JButton("Brettspiel Ergänzung");
private JButton knopf5 = new JButton("Neuer eintrag");
private JButton knopf5E = new JButton("Informationen abrufen");
private JButton knopf6E = new JButton("eigenes medium erstellen");
private JButton knopf6 = new JButton(eigenesmedium.getTitel());
private JButton knopf1M = new JButton("Titel");
private JButton knopf2M = new JButton("Spielzeit");
private JButton knopf3M = new JButton("besitz");
private JButton knopf4M = new JButton("kommentar");
private JButton knopf5M = new JButton("eigener eintrag");
//Eine Schaltfläche zum Anklicken
private JButton knopf_ende = new JButton("Beenden");
//Ein Beschriftungsfeld z.B. für Überschriften
private JLabel ueberschrift = new JLabel("Vererbung beispiel");
//Textfeld für Eingaben des Benutzers
private JTextField text1 = new JTextField("Für informationen auf das gewünschte feld klicken");
private JTextField text2 = new JTextField("");
private JTextField zahlen = new JTextField();

public GUI(){
//Erstelle Fenster
window.setSize(600,400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(null);

//Überschrift
ueberschrift.setLocation(50,30);
ueberschrift.setSize(400,50);
ueberschrift.setFont(new Font("Dialog", 0, 30));
window.add(ueberschrift);

//Schaltfläche 1
knopf1.setSize(150,30);
knopf1.setLocation(50,150);
knopf1.addActionListener(this);
window.add(knopf1);

knopf1E.setSize(150,30);
knopf1E.setLocation(50,150);
knopf1E.addActionListener(this);
window.add(knopf1E);
knopf1E.setVisible(false);
knopf1M.setSize(150,30);
knopf1M.setLocation(50,150);
knopf1M.addActionListener(this);
window.add(knopf1M);
knopf1M.setVisible(false);
//Schaltfläche 2
knopf_ende.setSize(150,30);
knopf_ende.setLocation(210,150);
knopf_ende.addActionListener(this);
window.add(knopf_ende);

knopf2.setSize(150,30);
knopf2.setLocation(50,190);
knopf2.addActionListener(this);
window.add(knopf2);

knopf2E.setSize(150,30);
knopf2E.setLocation(50,190);
knopf2E.addActionListener(this);
window.add(knopf2E);
knopf2E.setVisible(false);

knopf2M.setSize(150,30);
knopf2M.setLocation(50,190);
knopf2M.addActionListener(this);
window.add(knopf2M);
knopf2M.setVisible(false);
//Schaltfläche 2

knopf3.setSize(150,30);
knopf3.setLocation(210,190);
knopf3.addActionListener(this);
window.add(knopf3);

knopf3E.setSize(150,30);
knopf3E.setLocation(210,190);
knopf3E.addActionListener(this);
window.add(knopf3E);
knopf3E.setVisible(false);

knopf3M.setSize(150,30);
knopf3M.setLocation(210,190);
knopf3M.addActionListener(this);
window.add(knopf3M);
knopf3M.setVisible(false);

knopf4.setSize(150,30);
knopf4.setLocation(50,230);
knopf4.addActionListener(this);
window.add(knopf4);

knopf4E.setSize(150,30);
knopf4E.setLocation(50,230);
knopf4E.addActionListener(this);
window.add(knopf4E);
knopf4E.setVisible(false);

knopf4M.setSize(150,30);
knopf4M.setLocation(50,230);
knopf4M.addActionListener(this);
window.add(knopf4M);
knopf4M.setVisible(false);


knopf5.setSize(150,30);
knopf5.setLocation(210,230);
knopf5.addActionListener(this);
window.add(knopf5);

knopf5E.setSize(150,30);
knopf5E.setLocation(210,230);
knopf5E.addActionListener(this);
window.add(knopf5E);
knopf5E.setVisible(false);

knopf5M.setSize(150,30);
knopf5M.setLocation(210,230);
knopf5M.addActionListener(this);
window.add(knopf5M);
knopf5M.setVisible(false);

knopf6.setSize(150,30);
knopf6.setLocation(370,150);
knopf6.addActionListener(this);
window.add(knopf6);
knopf6.setVisible(false);

knopf6E.setSize(150,30);
knopf6E.setLocation(370,150);
knopf6E.addActionListener(this);
window.add(knopf6E);
knopf6E.setVisible(false);
text1.setSize(510,30);
text1.setLocation(50,110);
window.add(text1);
text1.setEditable(false);

text2.setSize(510,30);
text2.setLocation(50,270);
window.add(text2);
text2.setEditable(false);

zahlen.setSize(510,30);
zahlen.setLocation(50,270);
window.add(zahlen);
zahlen.setEditable(false);
zahlen.setVisible(false);

window.setVisible(true);

}
DVD dvd = new DVD();
CD cd = new CD();
Brettspiel brettspiel = new Brettspiel();
Videospiel videospiel = new Videospiel();

public void actionPerformed(ActionEvent a) {

dvd.setTitel("Film xy ");
dvd.setHabich(false);
dvd.setSpielzeit(120);
dvd.setKommentar(" lieblingsfilm ");

if(a.getSource() == knopf1){

if(dvd.getErgänzung() ==null){
text2.setText(dvd.getTitel() + dvd.getSpielzeit()+ dvd.getKommentar());

} else {
text2.setText(dvd.getTitel() + dvd.getSpielzeit()+ dvd.getKommentar()+ "ihre Ergänzung: "+dvd.getErgänzung());

}}

if(a.getSource() == knopf2){

cd.setTitel("top ten hits ");
cd.setHabich(true);
cd.setSpielzeit(60);
cd.setKommentar(" die nr 3 ist gut ");
if(cd.getErgänzung() ==null){
text2.setText(cd.getTitel() + cd.getSpielzeit()+ cd.getKommentar());

} else {
text2.setText(cd.getTitel() + cd.getSpielzeit()+ cd.getKommentar()+ " ihre Ergänzung: "+cd.getErgänzung());

}
}

videospiel.setTitel("ff7 ");
videospiel.setHabich(true);
videospiel.setSpielzeit(120);
videospiel.setKommentar(" Sephiroth ");
videospiel.setMindestspieleranzahl(1);
videospiel.setMaximalspieleranzahl(1);
videospiel.setPlatform(" PS4 ");
videospiel.setErgänzung("");
if(a.getSource() == knopf3){
if(videospiel.getErgänzung()==null){
text2.setText(videospiel.getTitel() + videospiel.getSpielzeit()+ videospiel.getKommentar()+ "mindestspieleranzahl: " + videospiel.getmindestspieleranzahl()+ " maximalspieleranzahl: "+ videospiel.getmaximalspieleranzahl()+ "Platform: "+ videospiel.getplatform());
} else {text2.setText(videospiel.getTitel() + videospiel.getSpielzeit()+ videospiel.getKommentar()+ "mindestspieleranzahl: " + videospiel.getmindestspieleranzahl()+ " maximalspieleranzahl: "+ videospiel.getmaximalspieleranzahl()+ "Platform: "+ videospiel.getplatform()+"ihre Ergänzung " +videospiel.getErgänzung());
}
}

brettspiel.setTitel("Monopoly ");
brettspiel.setHabich(true);
brettspiel.setSpielzeit(60);
brettspiel.setKommentar(" Schlossalee ");
brettspiel.setMindestspieleranzahl(2);
brettspiel.setMaximalspieleranzahl(6);

if(a.getSource() == knopf4){
if(brettspiel.getErgänzung()==null){
text2.setText(brettspiel.getTitel() + brettspiel.getSpielzeit()+ brettspiel.getKommentar() + "mindestspieleranzahl: " + brettspiel.getmindestspieleranzahl()+ " maximalspieleranzahl: "+ brettspiel.getmaximalspieleranzahl());

} else { text2.setText(brettspiel.getTitel() + brettspiel.getSpielzeit()+ brettspiel.getKommentar() + "mindestspieleranzahl: " + brettspiel.getmindestspieleranzahl()+ " maximalspieleranzahl: "+ brettspiel.getmaximalspieleranzahl()+"ihre Ergänzung: "+brettspiel.getErgänzung());
}
}
if(a.getSource() == knopf_ende){
//Programm beenden
System.exit(0);
}
if(a.getSource()== knopf5){
text1.setText("in die eingabe leiste die neuen daten eingeben und dann die gewünschte kategorie wählen");
knopf1.setVisible(false);
knopf2.setVisible(false);
knopf3.setVisible(false);
knopf4.setVisible(false);
knopf5.setVisible(false);

knopf1E.setVisible(true);
knopf2E.setVisible(true);
knopf3E.setVisible(true);
knopf4E.setVisible(true);
knopf5E.setVisible(true);
knopf6E.setVisible(true);
text2.setEditable(true);
text2.setText("");
}
if(a.getSource()== knopf5E){
knopf1.setVisible(true);
knopf2.setVisible(true);
knopf3.setVisible(true);
knopf4.setVisible(true);
knopf5.setVisible(true);

knopf1E.setVisible(false);
knopf2E.setVisible(false);
knopf3E.setVisible(false);
knopf4E.setVisible(false);
knopf5E.setVisible(false);
knopf6E.setVisible(false);
text2.setEditable(false);
text2.setText("");
if (eigenesmedium.getTitel()!=null ){
knopf6.setVisible(true);
}
}
if(a.getSource() == knopf1E){

if (text2.getText().trim().length() == 0){

text1.setText("bitte eine richtige Eingabe");
}
else{
dvd.setErgänzung(text2.getText().trim());
text2.setText("");
text1.setText("Ergänzung erfolgreich hinzugefügt");
}
}
if(a.getSource() == knopf2E){
if (text2.getText().trim().length() == 0){

text1.setText("bitte eine richtige Eingabe");
}
else{
cd.setErgänzung(text2.getText().trim());
text2.setText("");
text1.setText("Ergänzung erfolgreich hinzugefügt");
}
}
if(a.getSource() == knopf3E){
if (text2.getText().trim().length() == 0){

text1.setText("bitte eine richtige Eingabe");
}
else{
videospiel.setErgänzung(text2.getText().trim());
text2.setText("");
text1.setText("Ergänzung erfolgreich hinzugefügt");
}
}
if(a.getSource() == knopf4E){
if (text2.getText().trim().length() == 0){

text1.setText("bitte eine richtige Eingabe");
}
else{
brettspiel.setErgänzung(text2.getText().trim());
text2.setText("");
text1.setText("Ergänzung erfolgreich hinzugefügt");
}
}
if(a.getSource() == knopf6E){
knopf1E.setVisible(false);
knopf2E.setVisible(false);
knopf3E.setVisible(false);
knopf4E.setVisible(false);
knopf5E.setVisible(false);
knopf6E.setVisible(false);
text2.setEditable(true);

knopf1M.setVisible(true);
knopf2M.setVisible(true);
knopf3M.setVisible(true);
knopf4M.setVisible(true);
knopf5M.setVisible(true);
}
if(a.getSource() == knopf1M){
eigenesmedium.setTitel(text2.getText());
}
if(a.getSource() == knopf2M){
if (zahlen.getText()== ""){
text2.setVisible(false);
zahlen.setVisible(true);
zahlen.setEditable(true);
}
else if(zahlen.getText()!= ""){
x=zahlen.getText();
y=Integer.parseInt(x);
}
}
if(a.getSource() == knopf3M){

}
if(a.getSource() == knopf4M){

}
if(a.getSource() == knopf5M){

}
}}
 
In der Toolbar des Kommentar-Editors ist ganz links eine Schaltfläche "</>". Da drauf klicken, Code inkl. Einrückungen in die Textbox kopieren.

Zur Frage: dafür bietet sich ein JFormattedTextField an.
1. danke für den hinweis
2. jformattedtextfield hab ich auch oft gelesen aber im internet waren nur beispiele auf eigene klassen bezogen. aus diesen klassen konnte ich leider nicht erkennen wie das jformatted textfield funktioniert.
 
Wenn Du in Google nach jformattedtextfield suchst, bekommst Du als ersten Eintrag "How to Use Formatted Text Field" von Oracle (https://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html), ein Artikel aus dem Java Tutorial, der mit entsprechenden Erläuterungen und Beispielen aufwartet.

Beispielweise kannst Du ein NumberFormat erstellen, dieses entsprechend Deinen Vorstellungen konfigurieren und damit ein JFormattedTextField erstellen.
 
dafür bietet sich ein JFormattedTextField an
Das, oder einen eigenen DocumentFilter spendieren:
Java:
    public static void main(String[] args) {
        JTextField t = new JTextField("000");
        ((PlainDocument) t.getDocument()).setDocumentFilter(new DocumentFilter() {
            private boolean test(String s) {
                try {
                    Integer.parseInt(s);
                    return true;
                } catch (Exception e) {
                    return false;
                }
            }

            @Override
            public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
                super.remove(fb, offset, length);
            }

            @Override
            public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
                // Document doc = fb.getDocument();
                // String s = doc.getText(0, doc.getLength());
                if (test(string)) {
                    super.insertString(fb, offset, string, attr);
                }
            }

            @Override
            public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                // Document doc = fb.getDocument();
                // String s = doc.getText(0, doc.getLength());
                if (test(text)) {
                    super.replace(fb, offset, length, text, attrs);
                }
            }
        });
        JFrame f = new JFrame();
        f.setLayout(new GridLayout(2, 1));
        f.add(new JLabel("Ich will nur Zahlen:"));
        f.add(t);
        f.pack();
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setVisible(true);
    }
 
tut mir leid, dass ich wieder störe aber ich habe leider keine Lösung gefunden...
ich habe mir plain documents und auch jformattedtextfields angeguckt aber leider nicht auf mein Programm nicht anwenden können. die Beispiele im Internet und auf YouTube vor allem benutzen immer ein ganz anderes Programm, indem die das gut auch nicht selbst erstellen sondern aus einer liste die Textfelder etc. ziehen, weshalb ich das nicht ansatzweise anwenden kann. deswegen wollte ich fragen wie das funktioniert und auf Oracle habe ich auch nicht erschließen können wie das jetzt genau anwendbar ist. ich habe bis jetzt verstanden, dass man irgendwie eine klasse macht, Inder dieser "Filter" für das textfield ist und dann kann man anscheinend den Filter auf das Textfeld übertragen. Liege ich bis jetzt so richtig? und wenn nein was habe ich falsch verstanden? Mein hauptproblem ist halt dass ich keine person zum fragen habe, da die schulen derzeit geschlossen sind und meine lehrer anscheinend keine lust haben nach 3 tagen auf fragen zu antworten.
 
Zuletzt bearbeitet:
Was hast du denn noch nicht verstanden? Der DocumentFilter kann ungültige Eingaben "yielden", bevor diese ins TextField übernommen werden. Das heißt, beim Einfügen oder Ersetzen ungültige Werte landen nicht im TextField...
 
Hier mal die Variante via JFormattedTextField mit vielen Kommentaren zum Verständnis. Dieses Textfeld liefert eben direkt Integer-Objekte, so dass man nicht den Umweg über den String gehen muss. Dafür verhält es sich auch etwas anders wie die Variante mit dem DocumentFilter. Die beiden Ansätze lassen sich natürlich auch kombinieren, auch mit einem InputVerifier, aber wir wollen mal die Kirche im Dorf lassen 🙂

Java:
import java.awt.BorderLayout;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.text.NumberFormatter;

public class Test {

    public void run() {
        /* Zahlenformat: ganzzahlige Zahlen ohne Gruppierung */
        NumberFormat nf = NumberFormat.getIntegerInstance();
        nf.setGroupingUsed(false);

        /* Formatierer unter Verwendung des Zahlenformats 
           erstellen und konfigurieren */
        NumberFormatter formatter = new NumberFormatter(nf);
        formatter.setValueClass(Integer.class); // Integer-Objekte gewuenscht
        formatter.setMinimum(0); // Nicht-negative Eingaben, also von 0
        formatter.setMaximum(Integer.MAX_VALUE); // bis MAX_VALUE
        formatter.setAllowsInvalid(false); // Ungueltige Eingaben sind verboten
        formatter.setCommitsOnValidEdit(true); // Jeder gueltige Wert soll
                                               // ubernommen werden

        /* Textfeld erstellen, das den Formatierer verwendet. */
        JFormattedTextField input = new JFormattedTextField(formatter);
        input.setColumns(10); // gewuenschte Breite des Textfelds in "Spalten"

        JButton output = new JButton("Ausgabe");
        output.addActionListener(e -> {
            Integer value = (Integer) input.getValue();
            // mach was mit value
            System.out.println(value);
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(input, BorderLayout.NORTH);
        frame.add(output, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 

Zurück
Oben