tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1121
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    27
    Hallo!

    Aaaalso, ich hab zwei JTables mit der gleichen Anzahl an Spalten. Ansonsten sind die Dinger aber jeweils recht komplex und haben nix miteinander gemeinsam. Dennoch muss ich beide Tabellen so untereinander darstellen, dass es für den Benutzer aussieht, als handele es sich um eine einzige Tabelle. Weiß jemand, wie ich das bewerkstelligen könnte?
     

  2. #2
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Keine Ahnung. Darf ich fragen, was Du vor hast?
     

  3. #3
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    27
    Hi Snape,

    klar darfst Du. Ich hab zwei Table Models, wobei im ersten Strings mit Checkbox davor gerendert werden, im zweiten Zahlen. Die sind irgendwie aus dem ersten Model herausgerechnet, so eine Art "Summe". Das heißt, die Zellenrenderer sind komplett andere für die beiden Models. Außerdem gibt es auch noch andere Sachen, die verhindern, dass ich die beiden Models zu einem zusammenführe. Z.B. hab ich auf das erste Model einen Listener gesetzt, der mir sagt, wenn sich ein Eintrag ändert. Den kann ich aber in der zweiten "Tabelle", also im zweiten Model, nicht gebrauchen, usw.

    Es ist also schon so, dass ich zwei grundverschiedene Tabellen gegeben hab, auch wenn die zweite aus der ersten berechnet ist. Und die will ich halt schön darstellen in einer einzigen Tabelle, damit man die Daten immer schön auf einen Blick hat u.nicht mit dem Auge hin und herspringen muss, wenn man z.B. mit der Maus eine Zeile verschiebt oder sich die Größe einer Spalte in einer der Tabellen ändert.

    Dabei kommt mir gerade selbst ein (grauenhafter) Einfall: Ich könnte beide Einzelltabellen untereinander anzeigen und immer Spaltenreihenfolge und -weiten nachverfolgen, und wenn sie sich bei einer ändern, bei der anderen auch ändern. Aber ich dachte an eine schöne Lösung...
     

  4. #4
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    So spontan meine ich mich zu erinnern, dass bei einer Tabelle ohne Spaltennamen die Zeile mit den Spaltennamen gar nicht erst angezeigt wird. Oder war das bei einer Tabelle, die nicht in eine Scrollpane gelegt wird? Hm, mal ausprobieren.
     

  5. #5
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    27
    Hi! Hab das Problem bereits gelöst, auch wenn es mich fast den Sonntagnachmittag gekostet hätte... anbei der Code (c) Eques tenebrarum

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    
    import javax.swing.table.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
     
    /**
     * Use this class to synchronize the view of related tables with the same number of columns.
     *
     * The TickTableController keeps track of the cell widths and order of the given tables (via constructor parameter JTable[]) by listening to mouseReleased events, and synchronizes the tables.
     * In doing so the first table t[0] is used as a reference. Particularly note that changes to the other tables will take no effect (internally, they'll be undone).
     */
    public class TickTableController implements MouseListener{
        
        private JTable[] t;
        
        /**
         * @param t  Die zu verwaltenden Tabellen. Die mit t übergebenen Tabellen müssen in der Anzahl der Spalten übereinstimmen.
         */
        public TickTableController(JTable[] t){
            this.t = t;
            for(int i=0; i<t.length; i++) t[i].getTableHeader().addMouseListener(this); //Add a mouse listener to each table header
        }
        
        /**
         * Setzt die Reihenfolge der Spalten sowie deren Breite für alle Tabellen auf die durch die erste vorgegebenen Werte.
         * Wird automatisch nach einem mouseReleased-Event auf einen Table header aufgerufen.
         */
        public void synchronize(){ //Alle anderen richten sich nach der ersten Tabelle, t[0].
     
            for(int i=0; i<t[0].getColumnCount(); i++){
     
                TableColumn col1 = t[0].getColumn(t[0].getColumnName(i));
                int index1 = col1.getModelIndex();
                int width1 = col1.getWidth();
                
                //System.out.println(index1);
                //System.out.println(width1);
                
                for(int k=1; k<t.length; k++){ //Für jede weitere Tabelle
                    
                    //Idee: Suche die Spalte mit dem Model index index1 und gucke, wo sie auf dem Bildschirm ist.
     
                    TableColumn colk = null;
                    int indexk = -1;
                    int j = -1;
     
                    for(j=i; j<t[k].getColumnCount(); j++){
                        colk = t[k].getColumn(t[k].getColumnName(j));
                        indexk = colk.getModelIndex();
                        if(index1 == indexk) break;
                    }
                    //System.out.println("Col mit model index " + index1 + " ist momemtan an pos " + j);
                    //System.out.println((i == j) + " -- i = " + i + ", j = " + j);
     
                    if(i != j) t[k].moveColumn(j,i); //Ändert nichts am Model, nur am View. Bei moveColumn stört mich, dass in der Dokumentation steht, um Platz zu machen wird nicht immer der Rest nach rechts verschoben, sondern manchmal auch nach links. Aber das ist bestimmt nur so dahin geredet, und ich überhöre es.
     
                    //Jetzt sollte die i-te Spalte überall an der gleichen Position sein, so dass wir nur noch sicherstellen müssen, dass die Spalte in allen Tabellen die gleiche Breite hat.
                    int widthk = colk.getWidth();
                    if(width1 != widthk) colk.setPreferredWidth(width1);
                }
            }
        }
        
        /* *************************************************************************
         * Test
         *
         * Next thing to do is to provide a TickTableControllerPanel, that keeps
         * track of the horizontal scrollbars from the JScrollPanes the tables are
         * included in.
         */
        public static void main(String argv[]){
            
            //Setting up test table 1
            String[] cols1 = {"a","b","c"};
            Object[][] data1 = {
                {"a1","b1","c1"},
                {"a2","b2","c2"},
            };
            JTable table1 = new JTable(data1,cols1);
            table1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            
            //Setting up test table 2
            String[] cols2 = {"Sum a","Sum b","Sum c"};
            Object[][] data2 = {
                {"3","3","3"},
            };
            JTable table2 = new JTable(data2,cols2);
            table2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            
            //Setting up a test table controller
            TickTableController controller = new TickTableController(new JTable[]{ table1, table2 });
            
            //Setting up a test frame
     
            //So funktioniert es wunderbar :-) Aber in meinem Fall müssen die Tabellen in Scrollpanes sein, weil die Originaltables auch Row header besitzen, die dargestellt werden müssen.
            /*
            Box boxP = new Box(BoxLayout.Y_AXIS);
            boxP.add(table1.getTableHeader());
            boxP.add(table1);
            boxP.add(table2);
            JScrollPane boxJsp = new JScrollPane(boxP);
            */
     
            //Egal, erstmal irgendwas zum testen:
            JSplitPane boxJsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT,new JScrollPane(table1),new JScrollPane(table2));
     
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400,300);
            frame.getContentPane().add(boxJsp);
            frame.setVisible(true);
        }
        
        /* *************************************************************************
         * MouseListener methods
         */
        public void mouseClicked(MouseEvent e){
            //System.out.println("MouseListener: mouseClicked");
        }
        
        public void mouseEntered(MouseEvent e){
            //System.out.println("MouseListener: mouseEntered");
        }
        
        public void mouseExited(MouseEvent e){
            //System.out.println("MouseListener: mouseExited");
        }
        
        public void mousePressed(MouseEvent e){
            //System.out.println("MouseListener: mousePressed");
        }
        
        public void mouseReleased(MouseEvent e){
            //System.out.println("MouseListener: mouseReleased");
            synchronize();
        }
    }
     

  6. #6
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    27
    Ich hab schon wieder ein Problem mit diesen verflixten Tables...

    http://www.tutorials.de/forum/showth...39#post1050239

    Jedesmal, wenn ich denke, jetzt kann ich aber wirklich alles mit den Dingern anstellen
     

Ähnliche Themen

  1. MySQL - Bei Zusammenführen von zwei Tabellen Auto_Increment Spalte erstellen
    Von eingeist im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 20.09.10, 09:35
  2. MySQL - Zwei Tabellen in Abfrage zusammenführen
    Von d-braun im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 06.09.10, 12:04
  3. Zwei PDF-Dateien zusammenführen
    Von Bismark im Forum Sonstige Grafik-Programme
    Antworten: 3
    Letzter Beitrag: 06.01.09, 23:49
  4. zwei select zusammenführen
    Von imini im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 23.10.08, 20:22
  5. Zwei Tabellen mit SELECT zusammenführen
    Von RedWraith im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 24.06.08, 10:02