Eingabe von Zahlen in JTable und Fokusweitergabe

  • Themenstarter Themenstarter hippo
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

hippo

Gast
Hallo zusammen,

ich programmiere gerade an einer Notenverwaltung. Jetzt habe ich einige Anfoderungen an meine JTable Notentabelle bei denen ich nicht weiterkomme:

Die Notentabelle sollte folgende Features haben:
- bei Eingabe einer neuen Note, die alte löschen (alter Wert 2 => Eingabe einer 1 => 21 so nicht!)
- Wird die neue Eingabe mit CR abgeschlossen, den Fokus auf die nächste Aufgabe des Schülers setzen (nicht nach unten => nach links)
- Navigation mit den Cursortasten (geht jetzt schon) => die aktuelle Zeile kennzeichnen, indem nur die Namen grün hinterlegt werden

Wer kann mir weiterhelfen?

Gruß Stefan


Code:
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class TestTable extends JTable {

	public class TestTableModel extends AbstractTableModel {

		String[] columnNames = { "Name", "Vorame", "A1", "A2", "A3" };

		Object[][] data = { { "Mustermann", "Max", new Integer(4), new Integer(5), new Integer(10) },
				{ "Kaiser", "Franz", new Integer(0), new Integer(3), new Integer(2) } };

		public int getColumnCount() {
			return 5;
		}

		public int getRowCount() {
			return 2;
		}

		public String getColumnName(int col) {
			return columnNames[col];
		}

		public Object getValueAt(int row, int col) {
			return data[row][col];
		}

		public boolean isCellEditable(int row, int col) {
			return col > 1;
		}

	}

	public TestTable() {
		this.setModel(new TestTableModel());
	}

	public static void main(String[] args) {
		JFrame fr = new JFrame();
		fr.setContentPane(new TestTable());
		fr.setPreferredSize(new Dimension(250, 150));
		fr.pack();
		fr.setVisible(true);
	}

}
 
hippo hat gesagt.:
..den Fokus auf die nächste Aufgabe des Schülers setzen (nicht nach unten => nach links)..
Nach links, du fängst also mit der letzten Aufgabe des Schülers an?
Und wenn für den Schüler keine Aufgaben mehr da sind, dann letzte Aufgabe des nächsten Schülers?
Würdest du das bitte aufklären :?
 
Ich meine natürlich nach rechts. :wink: Sollte in der Programmierung aber wahrscheinlich kein großer Unterschied sein.
 
hippo hat gesagt.:
Ich meine natürlich nach rechts...
Code:
//package tableDemo; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 
public class TabellenNavigation_1 extends JFrame { 
    public TabellenNavigation_1() { 
        setTitle("Drücke Enter zum Navigieren"); 
        setDefaultCloseOperation( EXIT_ON_CLOSE ); 
        setSize(400,300); 
        setLocationRelativeTo( null ); 
        tabelle = new JTable( 
                new Object [][] { 
                    { "Mustermann", "Max", new Integer(4), new Integer(5), new Integer(10) }, 
                    { "Kaiser", "Franz", new Integer(0), new Integer(3), new Integer(2) } 
        }, 
                new String [] { 
            "Name", "Vorname", "A1", "A2", "A3" 
        }) { 
            public boolean isCellEditable(final int zeile, final int spalte) { 
                return spalte > 1; 
            } 
            Class[] types = new Class [] { 
                String.class, String.class, Integer.class, Integer.class, Integer.class 
            }; 
            
            public Class getColumnClass(final int columnIndex) { 
                return types [columnIndex]; 
            } 
            public Component prepareRenderer( 
                    final TableCellRenderer renderer, final int row, final int column) { 
                Component c = super.prepareRenderer(renderer, row, column); 
                c.setBackground(Color.white); 
                if (isRowSelected(row) && column < 2) 
                    c.setBackground(BGD_COLOR); 
                return c; 
            } 
        }; 
        getContentPane().add( new JScrollPane( tabelle ) ); 
        tabelle.addKeyListener(new KeyAdapter(){ 
            public void keyReleased(final KeyEvent e){ 
                tabelleKeyReleased(e); 
            } 
        }); 
        tabelle.changeSelection(0,2,false,false); 
        
        //Zum Editieren muss die Tabelle sichtbar sein !
        setVisible(true); 
        edit(tabelle.getSelectedRow(), tabelle.getSelectedColumn()); 
    } 
    private void tabelleKeyReleased(final KeyEvent e){ 
        int zeile = tabelle.getSelectedRow(); 
        int spalte = tabelle.getSelectedColumn(); 
        if(e.getKeyCode() != KeyEvent.VK_ENTER){ 
            edit(zeile, spalte); 
            return; 
        } 
        int zeilenAnzahl = tabelle.getRowCount(); 
        int spaltenAnzahl = tabelle.getColumnCount(); 
        do{ 
            spalte++; 
            if (spalte == spaltenAnzahl) { 
                spalte = 0; 
                zeile++; 
            } 
            if (zeile == zeilenAnzahl) { 
                zeile = 0; 
            } 
            //  Zurück zum Startpunkt, rausgehen. 
            //  (für den Fall wo keine Zelle editierbar ist) 
            if (zeile == tabelle.getSelectedRow() 
            &&  spalte == tabelle.getSelectedColumn()) { 
                break; 
            } 
        }while (! tabelle.isCellEditable(zeile, spalte) ); 
        tabelle.changeSelection(zeile, spalte, false, false); 
        edit(zeile, spalte); 
    } 
    private void edit(final int row, final int column){ 
        tabelle.editCellAt(row, column); 
        if(tabelle.getCellEditor()!=null){ 
            tabelle.getEditorComponent().requestFocusInWindow(); 
            JTextField text = (JTextField)tabelle.getEditorComponent(); 
            text.selectAll(); 
        } 
    } 
    private JTable tabelle; 
    private final Color BGD_COLOR = new Color(173,222,173);
    public static void main(final String[] args) { new TabellenNavigation_1();} 
}
 
:toll: Super! Danke. Funktioniert gut, jetzt muss ich erst einmal verstehen was Du da so gezaubert hast :wink:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben