tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
3692
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ich_Schmiddy ich_Schmiddy ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    28
    Hallo!

    Ich habe eine Tabelle, bei der die Spalten am Anfang eine bestimmte Breite haben. Die Inhalte der Spalten können am Anfang oft nicht komplett dargestellt werden, das ist soweit OK.

    Ist es jetzt möglich die Tabelle so zu definieren, daß wenn man auf den Strich zwischen zwei Spalten doppelklickt, die jeweilige Spalte dann auf die Breite geht, die zur kompletten Darstellung der Spalte benötigt wird?

    Ist etwas blöd erklärt, ich weiß, ich will halt einfach die Tabelle so haben,, daß man eine Spalte per Doppelklick größer machen kann, so wie es bei verschiedenen Tabellenkalkulationen der Fall ist.
     

  2. #2
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Original geschrieben von ich_Schmiddy
    Hallo!

    Ich habe eine Tabelle, bei der die Spalten am Anfang eine bestimmte Breite haben. Die Inhalte der Spalten können am Anfang oft nicht komplett dargestellt werden, das ist soweit OK.

    Ist es jetzt möglich die Tabelle so zu definieren, daß wenn man auf den Strich zwischen zwei Spalten doppelklickt, die jeweilige Spalte dann auf die Breite geht, die zur kompletten Darstellung der Spalte benötigt wird?

    Ist etwas blöd erklärt, ich weiß, ich will halt einfach die Tabelle so haben,, daß man eine Spalte per Doppelklick größer machen kann, so wie es bei verschiedenen Tabellenkalkulationen der Fall ist.
    Das gibts bestimmt, ist aber Fummelei, den Mausklick zu behandeln.
    Wie wäre es mit dieser Implementierung, die für alle Spalten die Breiten optimiert? (Einzubauen in Deiner von JTable abgeleiteten Klasse)

    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
    
        /**
         * Setzt für alle Spalten die optimale Spaltenbreite.
         * 
         */
        void sizeColumnsOptimal()
        {
            Point upperRow = null;
            Point lowerRow = null;
     
            // Bestimme die Anzahl der zu optimierenden Spalten.
            int optimizingColumns = getColumnCount();
     
            // Die verbrauchte Gesamtbreite
            int usedWidth = 0;
     
            for (int index = 0; index < optimizingColumns; index++)
            {
                // Bestimme die zu optimierenden Zeilen
                int fromRow = 0;
                int toRow = getRowCount();
     
                usedWidth += sizeColumnOptimal(index, fromRow, toRow);
            } // for 0..columnCount
     
            // Wenn die letzte Spalte nicht optimiert worden ist
            if (optimizingColumns < getColumnCount()
                && getColumnCount() >= 0
                && getScrollPane() != null
                && getScrollPane().getViewport() != null)
            {
                // Ermittle die zur Verfügung stehende Breite
                int useableWidth = getScrollPane().getViewport().getWidth();
     
                // Setze die letzte Spalte auf die verbleibende Breite
                int remainingWidth = Math.max(0, useableWidth - usedWidth);
                TableColumn column = getColumnModel().getColumn(getColumnCount() - 1);
     
                column.setPreferredWidth(remainingWidth);
                column.setWidth(remainingWidth);
            }
        }
     
     
        /**
         * Stellt für eine Spalte eine optimale Breite ein
         * @param index der Index der Spalte
         * @param fromRow die erste zu optimierende Zeile
         * @param toRow die letzte zu optimierende Zeile
         * @return die ermittelte Breite
         */
        public int sizeColumnOptimal(int index, int fromRow, int toRow)
        {
            TableColumn col = getColumnModel().getColumn(index);
            int prefSize = 0;
     
            if (col.getHeaderRenderer() != null)
            {
                prefSize =
                    col
                        .getHeaderRenderer()
                        .getTableCellRendererComponent(
                            null,
                            col.getHeaderValue(),
                            false,
                            false,
                            0,
                            0)
                        .getPreferredSize()
                        .width;
            }
            else
            {
                prefSize =
                    getDefaultRenderer(String.class)
                        .getTableCellRendererComponent(
                            this,
                            col.getHeaderValue(),
                            false,
                            false,
                            0,
                            0)
                        .getPreferredSize()
                        .width;
            }
     
            for (int rowIndex = fromRow; rowIndex < toRow; rowIndex++)
            {
                prefSize =
                    Math.max(
                        prefSize,
                        getCellRenderer(rowIndex, index)
                            .getTableCellRendererComponent(
                                this,
                                getValueAt(rowIndex, index),
                                false,
                                false,
                                rowIndex,
                                index)
                            .getPreferredSize()
                            .width);
            }
     
            // Für die Optik
            prefSize += getIntercellSpacing().width;
     
            col.setPreferredWidth(prefSize);
            col.setWidth(prefSize);
     
            return prefSize;
        }
     

  3. #3
    ich_Schmiddy ich_Schmiddy ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Beiträge
    28
    Vielen Dank für den Tip

    EIgentlich eine gute Idee, aber das Problem ist halt: manche Spalten sind sehr breit und sie sollen nur in der vollen breite angezeigt werden, wenn der Benutzer das wirklich will, nicht immer...
     

  4. #4
    Avatar von Der nette Mann
    Der nette Mann Der nette Mann ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    107
    Zitat Zitat von Snape
    Das gibts bestimmt, ist aber Fummelei, den Mausklick zu behandeln.
    Wie wäre es mit dieser Implementierung, die für alle Spalten die Breiten optimiert? (Einzubauen in Deiner von JTable abgeleiteten Klasse)

    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
    
        /**
         * Setzt für alle Spalten die optimale Spaltenbreite.
         * 
         */
        void sizeColumnsOptimal()
        {
            Point upperRow = null;
            Point lowerRow = null;
     
            // Bestimme die Anzahl der zu optimierenden Spalten.
            int optimizingColumns = getColumnCount();
     
            // Die verbrauchte Gesamtbreite
            int usedWidth = 0;
     
            for (int index = 0; index < optimizingColumns; index++)
            {
                // Bestimme die zu optimierenden Zeilen
                int fromRow = 0;
                int toRow = getRowCount();
     
                usedWidth += sizeColumnOptimal(index, fromRow, toRow);
            } // for 0..columnCount
     
            // Wenn die letzte Spalte nicht optimiert worden ist
            if (optimizingColumns < getColumnCount()
                && getColumnCount() >= 0
                && getScrollPane() != null
                && getScrollPane().getViewport() != null)
            {
                // Ermittle die zur Verfügung stehende Breite
                int useableWidth = getScrollPane().getViewport().getWidth();
     
                // Setze die letzte Spalte auf die verbleibende Breite
                int remainingWidth = Math.max(0, useableWidth - usedWidth);
                TableColumn column = getColumnModel().getColumn(getColumnCount() - 1);
     
                column.setPreferredWidth(remainingWidth);
                column.setWidth(remainingWidth);
            }
        }
     
     
        /**
         * Stellt für eine Spalte eine optimale Breite ein
         * @param index der Index der Spalte
         * @param fromRow die erste zu optimierende Zeile
         * @param toRow die letzte zu optimierende Zeile
         * @return die ermittelte Breite
         */
        public int sizeColumnOptimal(int index, int fromRow, int toRow)
        {
            TableColumn col = getColumnModel().getColumn(index);
            int prefSize = 0;
     
            if (col.getHeaderRenderer() != null)
            {
                prefSize =
                    col
                        .getHeaderRenderer()
                        .getTableCellRendererComponent(
                            null,
                            col.getHeaderValue(),
                            false,
                            false,
                            0,
                            0)
                        .getPreferredSize()
                        .width;
            }
            else
            {
                prefSize =
                    getDefaultRenderer(String.class)
                        .getTableCellRendererComponent(
                            this,
                            col.getHeaderValue(),
                            false,
                            false,
                            0,
                            0)
                        .getPreferredSize()
                        .width;
            }
     
            for (int rowIndex = fromRow; rowIndex < toRow; rowIndex++)
            {
                prefSize =
                    Math.max(
                        prefSize,
                        getCellRenderer(rowIndex, index)
                            .getTableCellRendererComponent(
                                this,
                                getValueAt(rowIndex, index),
                                false,
                                false,
                                rowIndex,
                                index)
                            .getPreferredSize()
                            .width);
            }
     
            // Für die Optik
            prefSize += getIntercellSpacing().width;
     
            col.setPreferredWidth(prefSize);
            col.setWidth(prefSize);
     
            return prefSize;
        }
    Das wäre das, was ich gebrauchen könnte, allerdings habe ich ein prob bei der Implementierung. Ich benutze den Visual Editor für Eclipse.

    Warum frägst Du in der von JTable abgeleiteten Klasse (in meinem Fall MyTable.java) getScrollPane ab? Das gibt's bei mir gar nicht in der Klasse, wenn dann nur in der Klasse, wo die Tabelle reinkommt. Steh ich auf dem Schlauch, oder wie kann ich mir das sonst erklären?

    Danke

    Der nette Mann
     
    adioz - La Ultima Tour 2004
    Viva Los Tioz

  5. #5
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von Der nette Mann
    Das wäre das, was ich gebrauchen könnte, allerdings habe ich ein prob bei der Implementierung. Ich benutze den Visual Editor für Eclipse.

    Warum frägst Du in der von JTable abgeleiteten Klasse (in meinem Fall MyTable.java) getScrollPane ab? Das gibt's bei mir gar nicht in der Klasse, wenn dann nur in der Klasse, wo die Tabelle reinkommt. Steh ich auf dem Schlauch, oder wie kann ich mir das sonst erklären?

    Danke

    Der nette Mann
    Sorry, da habe ich wohl etwas vergessen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
        /**
         * Liefert die ScrollPane, in der diese Tabelle liegt
         */
        JScrollPane getScrollPane()
        {
            Container cont = getParent();
     
            while (cont != null && !(cont instanceof JScrollPane))
            {
                cont = cont.getParent();
            }
     
            return (JScrollPane) cont;
        }
     

  6. #6
    Avatar von Der nette Mann
    Der nette Mann Der nette Mann ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    107
    Hab mich schon gewundert Hab Dein Code etwas umgeschrieben und es funktioniert bei mir ganz wunderbar. Genauso sollte das aussehen.

    Vielen Dank für diesen Tipp (auch wenn er schon etwas älter war das suchen hat sich somit gelohnt)


    Grüße

    Der nette Mann
     
    adioz - La Ultima Tour 2004
    Viva Los Tioz

  7. #7
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von Der nette Mann
    Hab mich schon gewundert Hab Dein Code etwas umgeschrieben und es funktioniert bei mir ganz wunderbar. Genauso sollte das aussehen.
    Prima. Was hast Du geändert? Etwas das ich wissen sollte?

    Vielen Dank für diesen Tipp (auch wenn er schon etwas älter war das suchen hat sich somit gelohnt)

    Grüße
    Der nette Mann
    Prima.
     

  8. #8
    Avatar von Der nette Mann
    Der nette Mann Der nette Mann ist offline Mitglied Gold
    Registriert seit
    Feb 2002
    Beiträge
    107
    Och, ich hab eigentlich nix weltbewegendes geändert. Ich hab die Breite der Spalten angepasst ohne dass ich auf die darunterliegende ScrollPane Rücksicht genommen habe.

    Die Schleifen über die Spalten hab ich auch gemacht und mir dann die Werte der Breite über den Funktionsaufruf sizeColumnOptimal geholt.

    Wie gesagt, hab genau das gewünschte Ergebnis

    Gruß

    Der nette Mann
     
    adioz - La Ultima Tour 2004
    Viva Los Tioz

Ähnliche Themen

  1. CSS, breite der Tabelle und Spalten?
    Von 0Byte im Forum CSS
    Antworten: 1
    Letzter Beitrag: 08.02.09, 10:58
  2. Antworten: 2
    Letzter Beitrag: 28.06.08, 00:24
  3. Antworten: 6
    Letzter Beitrag: 07.12.07, 14:57
  4. Tabelle - Breite bei 3 Spalten
    Von Alaniel im Forum HTML & XHTML
    Antworten: 2
    Letzter Beitrag: 19.07.04, 15:16