Prob:Tabelle bei Zellensprung: Letzte zeile doppelt sichtbar

Status
Nicht offen für weitere Antworten.

anquijix

Mitglied
Hallo

Ich hab da ein sinnfreies Problem zu beheben.. Ich hab eine Tabelle (SearchPane), deren Zellen (TableCell), je nach Resultat der Datenbank, editierbar werden oder eine bestimmte Farbe erhalten.
Weiter hat es einen CellEditingListener (abgeleitet von AbstractCellEditingListener), der auf Enter reagiert und in die nächste fokussier- und editierbare Zelle springt und bei neuen Einträgen gleich noch eine DB-Prozedur aufruft, die die Daten abspeichert.

Nun habe ich einen Fall, in dem ich von einer editierbaren Zelle irgendwo in der Mitte in die letzte Zelle springen kann, sprich die Zelle in der letzten Zeile. Wenn ich jetzt das Fenster soweit verkleinere, dass der Fensterrand knapp unter der letzten Zeile ist und dann von der Zelle in der Mitte zur letzten Zelle springen möchte, dann sehe ich plötzlich die letzte Zeile doppelt, bzw leicht verschoben über sich selbst.
Die erste Zeile der Tabelle ist dann im Nirwana verschwunden. Anders ausgedrückt wurde die ganze Tabelle um eine Zeile nach oben "verschoben", was die erste Zeile verdeckte.

Wenn ich nun mit der Maus aus dem Fenster gehe bzw. wieder rein, dann wird die Tabelle wieder korrekt angezeigt. Daher kam ich zum Schluss, dass es irgendwie nicht richtig reloaded wird oder sowas in der Richtung. Darauf habe ich versucht, diverse Methoden auf das SearchPane anzuwenden. z.B. repaint(), revalidate(), updateUI().. einfach alles, was irgend einen Bezug zum Zeichnen der Tabelle haben könnte.
Das Problem tritt jedoch in jedem Fall auf.

Hier noch mit Screenshot erläutert:

Ich befinde mich in der Zelle im mittleren Bereich:

52dwo69.jpg


Nun möchte ich mit Enter in die unterste Zelle springen, folgender Effekt:

5ywzdya.jpg


Lässt sich das vermeiden? Wenn ja, wie am besten?



p.s ich zähle mich nach ca 2.5 jahren immer noch zu den blutigsten anfängern..
 
ich hatte auch schon einige male so ein problem, wobei's bei mir immer daran lag, daß ich den zeilen etwas zu wenig platz (in vertikaler richtung) gegeben hatte. ob das bei dir das problem ist, kann ich jetzt auch nicht sagen, aber ich empfehl dir, es mal auszuprobieren, sprich, von deinem JTable mal die methode setRowHeights(...) mit einem etwas größeren wert aufzurufen. vielleicht erschlägt es ja das problem, denn sonst würd ich (mit meinen über 6 jahren java-erfahrung) auch auf dem schlauch stehen.

vorsichtshalber drück ich dir gleich mal die daumen, daß es daran liegt :wink:

wayne
 
Ich hab's versucht nachzuvollziehen, funktioniert aber:
Code:
package table;
/*
 * CellJumpDemo.java
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class CellJumpDemo extends JFrame {
    private JTable table;
    private DefaultTableModel model;
    Color color1 = new Color(204, 204, 204);
    Color color2 = new Color(253, 255, 152);
    public CellJumpDemo() {
        super("CellJumpDemo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        model = new DefaultTableModel(20, 3) {
            public Class getColumnClass(final int columnIndex) {
                if(columnIndex == 1) return Integer.class;
                return String.class;
            }
        };
        for (int i = 0; i < model.getRowCount(); i++){
            model.setValueAt(""+(i+1), i, 0);
            model.setValueAt("0", i, 1);
        }
        table = new JTable(model){
            public Component prepareRenderer(final TableCellRenderer renderer, 
                    final int row, final int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                c.setBackground(Color.WHITE);
                if(column == 2){
                    c.setBackground(color1);
                }
                if(column == 1){
                    c.setBackground(color2);
                }
                return c;
            }
        };
        getContentPane().add(new JScrollPane(table), BorderLayout.EAST);
        CellEditorListener cel = new CellEditorListener() {
            public void editingStopped(final ChangeEvent e) {
                int row = table.getRowCount()-1;
                int column = 1;
                table.changeSelection(row, column, false, false);
                table.editCellAt(row, column);
                JTextField tf = (JTextField)table.getEditorComponent();
                tf.requestFocusInWindow();
                tf.selectAll();
            }
            public void editingCanceled(final ChangeEvent e) {}
        };
        table.getDefaultEditor(Integer.class).addCellEditorListener(cel);
        pack();
    }
    public static void main(final String args[]) {new CellJumpDemo().setVisible(true);}
}
 
Haha, das funzt mit dem setRowHeight. Danke dir!
Auch wenn ich das Problem dadurch trotzdem nicht erklären kann, wie so vieles bei Java.. vllt in ein paar Jahren
 
André Uhres hat gesagt.:
anquijix hat gesagt.:
..Auch wenn ich das Problem dadurch trotzdem nicht erklären kann..
Bau doch bitte mal den Fehler in mein obiges Beispiel ein, dann kommen wir der Sache wohl näher :wink:

Da habe ich keinen Plan... Mir wurde dieses grössere Java-Projekt fast vollständig übergeben, da unser erfahrener Java-Guru, der das Ganze im Alleingang aufgesetzt hat, nicht mehr hier arbeitet. Keine Ahnung, welcher Code fehlerhaft ist, geschweige denn wo ich den finden würde. Ist alles über mehrere Files verteilt. Ich bin schon froh, wenn ich die richtige Codestelle finde, um ein Problem beheben zu können.

Ich bin nicht einmal fähig, dein Beispiel zu starten.

habs compiliert mit javac und dann mit java gestartet:

Code:
Exception in thread "main" java.lang.NoClassDefFoundError: CellJumpDemo (wrong name: table/CellJumpDemo)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
 
anquijix hat gesagt.:
..
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: CellJumpDemo (wrong name: table/CellJumpDemo)
Das ist wahrscheinlich nur ne Kleinigkeit :wink:
Nimm erstmal das "package" statement raus und versuch's nochmal.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben