CellEditor der nur Eingaben int 1-9 und "null" er

Status
Nicht offen für weitere Antworten.

VIDEN

Mitglied
So, jetzt zum CellEditor.

Ich will das man in die Zellen meines JTables NUR Zahlen von 1-9 eintragen kann (Sudoku Spielfeld). Es soll sofort verhindert werden, dass mehr wie eine Stelle eingetragen wird und andere Zeichen.
Deshalb habe ich diese Klasse hier von SUN benutzt:
http://java.sun.com/docs/books/tutorial/uiswing/components/examples/IntegerEditor.java
und folgendes in den JTable geschrieben:
Code:
grid.setDefaultEditor(Integer.class, new IntegerEditor(1, 9));
Sobald ich nun eine andere Zahl eingebe kommt ein Error und ich muss die Zahl korrigieren.
Es ist aber trotsdem möglich andere Zahlen einzugeben, nur kommt eben dann der Error.
Gibt es auch einen Möglichkeit das die andere Zahlen erst garnicht eingegeben werden können?
d.h. nur eine Zahl und die darf nur 1-9 sein?

Das zweite Problem ist, ausser den 1-9 würde ich gerne noch "null" akzeptieren.
zB Man will eine Zahl in ein Feld schreiben, merkt aber dann, dass das nicht geht. Also will man ohne Eingabe wieder aus dem Editmode gehen.
Ich habe leider keine Möglichkeit gefunden das "null" mit in die validValues aufzunehmen.


Grüsse David
 

André Uhres

Top Contributor
Alternative: JTable nicht editierbar machen und KeyListener dran machen.
Bei keyPressed:
Code:
       char c = evt.getKeyChar();
        if(Character.isDigit(c)){
            sudokuTable.setValueAt(c == '0' ? null : c,
                    sudokuTable.getSelectedRow(),sudokuTable.getSelectedColumn());
        }

Kleines Beispiel:
Code:
package table;
/*
 * SudokuTableDemo.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class SudokuTableDemo extends JFrame {
    private JTable sudokuTable;
    public SudokuTableDemo() {
        super("Sudoku");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(174,171);
        setLocationRelativeTo(null);
        sudokuTable = new JTable(){
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (!(isRowSelected(row) && isColumnSelected(column))) {
                    c.setBackground(Color.lightGray);
                    ((JLabel)c).setHorizontalAlignment(JLabel.CENTER);
                    if((row>=0 && row <=2) && (column>=3 && column<=5)) c.setBackground(Color.white);
                    if((row>=3 && row <=5) && (column>=0 && column<=2)) c.setBackground(Color.white);
                    if((row>=3 && row <=5) && (column>=6 && column<=8)) c.setBackground(Color.white);
                    if((row>=6 && row <=8) && (column>=3 && column<=5)) c.setBackground(Color.white);
                }
                return c;
            }
        };
        sudokuTable.setModel(new DefaultTableModel(9,9) {
            Class[] types = new Class [] {
                Integer.class, Integer.class, Integer.class, Integer.class, 
                Integer.class, Integer.class, Integer.class, Integer.class, Integer.class
            };
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
        });
        sudokuTable.setCellSelectionEnabled(true);
        sudokuTable.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                sudokuKeyPressed(evt);
            }
        });
        sudokuTable.changeSelection(0,0,false,false);
        getContentPane().add(sudokuTable, BorderLayout.CENTER);
    }
    private void sudokuKeyPressed(KeyEvent evt) {
        char c = evt.getKeyChar();
        if(Character.isDigit(c)){
            sudokuTable.setValueAt(c == '0' ? null : c,
                    sudokuTable.getSelectedRow(),sudokuTable.getSelectedColumn());
        }
    }
    public static void main(String args[]) {new SudokuTableDemo().setVisible(true);}
}
 

VIDEN

Mitglied
Danke für die Antwort, ich hatte die vorletzte Woche frei und musste letze Woche auf die Berufsakademie und kann mich deswegen erst jetzt wieder mit dem Thema beschäftigen.

Wenn ich sudokuKeyPressed(KeyEvent evt) benutze kann ich aber jedes Feld ändern oder nicht?
Ich will nähmlich, dass die gegebenen Zahlen und die vom Solver gelösten Felder nicht Editierbar sind.

Und was machst du genau in dieser Zeile?:

Code:
sudokuTable.setValueAt(c == '0' ? null : c, 
                    sudokuTable.getSelectedRow(),sudokuTable.getSelectedColumn());

ich kenne den Operator "?" nicht und was bedeutet das "null : c" danach?


Grüsse David
 

André Uhres

Top Contributor
VIDEN hat gesagt.:
..Wenn ich sudokuKeyPressed(KeyEvent evt) benutze kann ich aber jedes Feld ändern oder nicht?
Ich will nähmlich, dass die gegebenen Zahlen und die vom Solver gelösten Felder nicht Editierbar sind.
Code:
   private void sudokuKeyPressed(KeyEvent evt) {
        int row = sudokuTable.getSelectedRow();
        int column = sudokuTable.getSelectedColumn();
        char c = evt.getKeyChar();
        if(Character.isDigit(c) && !isCellSolved(row, column)){//<----------------------
            sudokuTable.setValueAt(c == '0' ? null : c, row, column);
        }
    }
    private boolean isCellSolved(int row, int column) {//<-----------------------------
        //hier bestimmst du was nicht mehr editierbar ist:
        if( row == 1 && column == 1) {
            return true;
        }
        return false;
    }

VIDEN hat gesagt.:
..ich kenne den Operator "?" nicht ..
http://www.java-forum.org/de/viewtopic.php?p=183263#183263
 

VIDEN

Mitglied
hey,

Habe es versucht umzusetzten aber ich habe ein kleines Problem:

"sudokuKeyPressed" übergibt dem JTable eine "char" Variable die in das Feld geschrieben werden soll.
Das "setValueAt" von meinem Table Model braucht aber eine int Variable, damit es noch kurze Berechnungen durchführen kann. Ich habe geschaut aber es scheint keine schöne saubere char to int Lösung zu geben -.-

Code:
public void setValueAt(Object value, int row, int col) {
            if(value==null)
                return;
            if(data[row][col].num==0&&(Integer)value!=0&&value!=null)
                currentBoard.userMatrix.incNumSolvedCells();
            if(data[row][col].num!=0&&((Integer)value==0||value==null))
                currentBoard.userMatrix.decNumSolvedCells();
            data[row][col].num=(Integer) value;
            data[row][col].setColor("black");
            fireTableCellUpdated(row, col);
        }

Wenn ich hier jetzt die char Variable übergebe kommt es immer zu Fehlern.

Grüsse David

EDIT:

okay ich habe es jetzt hinbekommen aber es sieht finde ich nicht all zu sauber aus...
Ach ja und ich habe "MyTableModel" in mein "Board" Integriert, was das die ganzen Zellen des Sudokus sowieso schon verwalted:

Code:
    public void setValueAt(Object value, int row, int col) {
        if(value==null)
            return;
        String strValue=value.toString();
        int nValue=Integer.parseInt(strValue);

        userMatrix.setCellValue(row, col, nValue);
        userMatrix.matrix[row][col].setColor("black");
        fireTableCellUpdated(row, col);
    }

Grüsse David
 

VIDEN

Mitglied
Noch eine Frage, wie ändere ich die Grösse des JTables?
Im NetBeans Graphical Editor gibt es zwar 2 Felder für Size Horizotal und Size Vertical, aber wenn ich diese verändere, wird die Tabelle nur um einen weissen Rand der grösse erweitert. die Tabelle selber bleibt gleich. Daher gehe ich davon aus, das ich das irgendwo im meinem Renderer oder TableModel oder was weis ich wo ändern muss nur weis ich eben nicht wo.
Das Problem ist nämlich, dass meine Tabelle minimal breiter wie hoch ist.

Grüsse David
 

André Uhres

Top Contributor
Hast du veilleicht "sudokuTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)" gesetzt?
Sonst poste mal deinen Code.
 

VIDEN

Mitglied
Hmm ne das habe ich nirgends gefunden.

Das hier müsste der generierte Code sein, der die Grösse bestimmt:

sudokuTable ist mein JTable,
gridPanel ist das JPanel in dem es drinne ist. ausser dem JTable ist nichts im gridPanel.

Code:
        sudokuTable.setModel(currentBoard);
        sudokuTable.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt) {
                sudokuKeyPressed(evt);
            }
        });
        Renderer cellRenderer= new Renderer();
        sudokuTable.setDefaultRenderer(Integer.class, cellRenderer);
        sudokuTable.setCellSelectionEnabled(true);

        org.jdesktop.layout.GroupLayout gridPanelLayout = new org.jdesktop.layout.GroupLayout(gridPanel);
        gridPanel.setLayout(gridPanelLayout);
        gridPanelLayout.setHorizontalGroup(
            gridPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(gridPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(sudokuTable, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 180, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        gridPanelLayout.setVerticalGroup(
            gridPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(gridPanelLayout.createSequentialGroup()
                .addContainerGap()
                .add(sudokuTable, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 145, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );


Wenn ich es so eingestellt habe: JTable auf 180x180 und JPanel auf default sieht es so aus:



Ist der JTable auf 180x145 (wie im Code) und der JPanel auf default sieht es so aus:



Das ist meine erste GUI die ich mache, daher kenne ich mich kaum aus, aber macht es überhaupt Sinn, den JTable in einen JPanel zu machen, wenn er eh das einzige Objekt in dem JPanel ist?

Ich hoffe du kannst helfen :)

Grüsse David

PS: Bei bedarf kann ich auch den ganzen Code zur verfügung stellen
 

André Uhres

Top Contributor
Versuch's mal so:
Design view | Inspector:
Rechstklick auf JFrame --> Set Layout: BorderLayout
Rechstklick auf gridPanel --> Set Layout: GridBagLayout
 

VIDEN

Mitglied
vielen Dank! Hat so wunderbar funktioniert.
Jetzt kann ich endlich meine erste stable Beta releasen. :)

Grüsse David
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
E Swing CellEditor mit Combobox durch Tastatureingabe editieren?! AWT, Swing, JavaFX & SWT 3
E Swing CellEditor bei Fokusverlust Bearbeitung beenden?! AWT, Swing, JavaFX & SWT 6
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
lumo SWT CellEditor & Popup AWT, Swing, JavaFX & SWT 3
lumo SWT Table CellEditor - knifflig AWT, Swing, JavaFX & SWT 35
D SWT JFace TableViewer nächster CellEditor nach Enter aktivieren AWT, Swing, JavaFX & SWT 5
dzim JFace ListViewer-Einträge mit CellEditor? AWT, Swing, JavaFX & SWT 3
R JTable: ploetzlich ist der CellEditor weg? :( AWT, Swing, JavaFX & SWT 4
G CellEditor - Kein "Textfeld" AWT, Swing, JavaFX & SWT 6
G JTable mit JComboBox als Celleditor, selectedRow falsch! AWT, Swing, JavaFX & SWT 3
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
M CellEditor für individuelle Zellen in JTable AWT, Swing, JavaFX & SWT 3
J CellEditor per Button beenden AWT, Swing, JavaFX & SWT 2
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
J Event Handling Button "enablen" wenn Eingaben in Textfeldern korrekt sind AWT, Swing, JavaFX & SWT 1
B Eingaben im JDialog abwarten AWT, Swing, JavaFX & SWT 4
M Swing JTable >> Eingaben prüfen => Empfehlungen? AWT, Swing, JavaFX & SWT 2
F In Action Listener TextFields einlesen und prüfen. Abbruch bei falschen Eingaben. Wie mache ich das? AWT, Swing, JavaFX & SWT 2
U Swing JTextField zur Laufzeit auf Eingaben prüfen AWT, Swing, JavaFX & SWT 0
A Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen AWT, Swing, JavaFX & SWT 10
M JDialog übergibt eingaben nicht an aufrufende klasse AWT, Swing, JavaFX & SWT 15
Kaniee Swing Woher bekommt JTextField die Eingaben? AWT, Swing, JavaFX & SWT 2
B Kommunikation zwischen zwei Fenstern und vorübergehende Speicherung der Eingaben AWT, Swing, JavaFX & SWT 4
D JTextField doppelte Eingaben ausschließen AWT, Swing, JavaFX & SWT 9
C Swing Default Werte für JFormattedTextField und Eingaben zurücksetzen AWT, Swing, JavaFX & SWT 5
V JTextField nimmt keine Eingaben an, nach nachträglichem setVisible des JWindows AWT, Swing, JavaFX & SWT 4
J Wie kann man in SWT das GUI vor Eingaben blockieren AWT, Swing, JavaFX & SWT 6
R SWT - Im Textfeld nur numerische Eingaben erlauben AWT, Swing, JavaFX & SWT 10
M Dialog erstellen und Eingaben lesen? AWT, Swing, JavaFX & SWT 20
Z textField.getText = null AWT, Swing, JavaFX & SWT 15
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
AmsananKING Textfelder sind gleich null AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
J Injection - Aber Controller sind null AWT, Swing, JavaFX & SWT 3
J Controller ist null - Warum AWT, Swing, JavaFX & SWT 3
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
N SceneBuilder wie auf Attribute zugreifen? Diese sind immer null. AWT, Swing, JavaFX & SWT 6
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
D Zwischen Null-Layouts wechseln AWT, Swing, JavaFX & SWT 2
S Unverstandene Null.PointException AWT, Swing, JavaFX & SWT 4
D AWT Graphics2D getClip gibt null zurück AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
G Swing, JavaFx - Felder aus FXML sind null AWT, Swing, JavaFX & SWT 6
K Swing JSpinner mit NULL AWT, Swing, JavaFX & SWT 3
F JavaFX Properties und NULL Werte AWT, Swing, JavaFX & SWT 2
M JTextField gibt beim auslesen null aus AWT, Swing, JavaFX & SWT 9
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
S String is null Fehler AWT, Swing, JavaFX & SWT 2
R Swing JLabel gibt stets 'null' aus AWT, Swing, JavaFX & SWT 3
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
P Swing JTable null values an das Ende verschieben AWT, Swing, JavaFX & SWT 2
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
C JTable sorter GregorianCalender null Exc AWT, Swing, JavaFX & SWT 4
N Swing JFrame==null und doch nicht null?! AWT, Swing, JavaFX & SWT 4
N JButton Border(null) AWT, Swing, JavaFX & SWT 3
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
K Swing regexFilter() null filtern AWT, Swing, JavaFX & SWT 3
R Swing JComboBox - Null-Feld AWT, Swing, JavaFX & SWT 7
M SWT DateTime per default null Wert ? AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
J JScrollPane & Null-Layout AWT, Swing, JavaFX & SWT 12
A JPanel mit Layout(null) in JPanel AWT, Swing, JavaFX & SWT 4
G Zentrieren mittels setLocationRelativeTo(null);? AWT, Swing, JavaFX & SWT 14
G Value vom TreeCellEditor ist immer null AWT, Swing, JavaFX & SWT 3
G JTree Problem: Null Child not allowed AWT, Swing, JavaFX & SWT 12
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
C getGraphics() liefert nur null AWT, Swing, JavaFX & SWT 4
H null Layout -> Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
G Probleme mit Content bei Null-Layout verändern AWT, Swing, JavaFX & SWT 7
T Null Layout Problem. AWT, Swing, JavaFX & SWT 3
M JFormattedTextField und Null-Werte AWT, Swing, JavaFX & SWT 4
S Text im JLabel wird nicht als null anerkannt AWT, Swing, JavaFX & SWT 4
I Null-Layout-Problem AWT, Swing, JavaFX & SWT 2
M Problem mit NULL-Layout AWT, Swing, JavaFX & SWT 2
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
G null pointer mit getText AWT, Swing, JavaFX & SWT 2
H getGraphics() eines JPanel liefert immer null zurück AWT, Swing, JavaFX & SWT 6
F PanelBounds an TextPaneBounds anpassen LayoutManager: Null AWT, Swing, JavaFX & SWT 2
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
M bei filechooser.showSaveDialog(null); auf Datein. zugreifen AWT, Swing, JavaFX & SWT 2
B NULL Layout - TextFelder verschwinden AWT, Swing, JavaFX & SWT 8
F Scrollen bei JTextArea in einem Null-Layout? Unmöglich? AWT, Swing, JavaFX & SWT 4
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
R Komponenten frei per Drag&Drop in (z.B.) Null-Layout bew AWT, Swing, JavaFX & SWT 2
B [Swing] Null-Layout AWT, Swing, JavaFX & SWT 2
G Scrollpane in null-Layout einfügen AWT, Swing, JavaFX & SWT 5
G JList: Anzeige von null-Werten verhindern AWT, Swing, JavaFX & SWT 3
W Probleme mit Border- und null-Layout AWT, Swing, JavaFX & SWT 8
Z createImage() liefert null zurück AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben