GridLayout - wie am besten implementieren

blz

Bekanntes Mitglied
Hallo zusammen,
ich habe keine große Erfahrung in der GUI-Programmierung.
Habe ein kleines Projekt, bei dem ich jetzt aber doch eine graphische Eingabe brauche, und zwar möchte ich ein Raster mit 8 x 11 Eingabefeldern haben, bei dem in jedes eine Zahl von 1 bis 33 eingegeben werden kann.
Meine Recherchen haben ergeben, dass ich als Layout hier wohl das GridLayout wählen sollte.
Erst habe ich versucht, mir die ganze GUI-Sache from scratch zu erarbeiten und mir das Fenster händisch zu basteln, bin aber gescheitert. Habe dann gedacht, vllt. ist das auch nicht unbedingt nötig, da ich so etwas so gut wie nie brauche, und habe zwei Editoren ausprobiert. (erst in eclipse und dann eine BlueJ-Erweiterung).
Aber auch damit hab ich das nicht vernünftig hingekriegt.
Daher wollte ich mal anfragen, was ihr mir empfehlen könnt und ob nicht vllt. jemand ein Minimalbeispiel posten könnte, dass ich mir ausbauen könnt 🙂
Vielen Dank für die Hilfe!
 
GridLayout ist doch sehr simpel:
Java:
  public static void main(String[] args) {

     JPanel panel = new JPanel();
     panel.setLayout(new GridLayout(8, 11));
     for (int i = 0; i < 88; i++) {
       panel.add(new JTextField(2));
     }

     JFrame frame = new JFrame();
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.add(panel);
     frame.pack();
     frame.setLocationRelativeTo(null);
     frame.setVisible(true);
   }
 
bei dem in jedes eine Zahl von 1 bis 33 eingegeben werden kann.
Ich denke sein Hauptproblem ist die Begrenzung des Inputs auf 1 - 33. Deshalb meine Erweiterung Deines Codes Enceladus27.

Java:
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class start {
    public static void main(String[] args) {
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(8, 11));
        for (int i = 0; i < 88; i++) {
            JTextField txt = new JTextField(2);          
            txt.setDocument(new NumberRange(33));
            panel.add(txt);        }

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Java:
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class NumberRange extends PlainDocument {
    private static final long serialVersionUID = 3293080459192819357L;
    private int max = 100; // maximum allowed value
    private int maxLenght = 1; // maximum allowed string length

    public NumberRange(int max) {
        this.max = max;
        maxLenght = (max + "").length();
    }

    @Override
    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        if (str == null || getLength() == maxLenght)
            return;
        str = str.replaceAll(".*[^0-9]", ""); // remove all non digits
        try {
            int len = getLength();
            String test = getText(0, offset) + str; // cursor at end
            if (len != offset) // cursor not at end
                test = getText(0, offset) + str + getText(offset, len);
            int value = Integer.parseInt(test.trim()); // calculate value
            if (value > max) // value larger then maximum
                return;
            super.insertString(offset, str, attr);
        } catch (NumberFormatException e) {
            System.out.println(e);
        } catch (BadLocationException e) {
            System.out.println(e);
        }
    }
}
Die Klasse NumberRange lässt sich natürlich noch verfeinern. 😉
 
Zuletzt bearbeitet von einem Moderator:
Hey, vielen Dank,
hilft mir beides voll!!
Werde ggf. nochmal nachhaken müssen demnächst, wenn ich das alles eingearbeitet hab ... 🙂
 

Zurück
Oben