[Java]JTableHeader gebruikt niet background JTable

Pagina: 1
Acties:

  • Fresh T.
  • Registratie: Februari 2002
  • Laatst online: 16:27
Ik ben aan het proberen een JTable te gebruiken in mijn programma. Deze JTable is toegevoegd aan een JScrollPane, die op zijn beurt weer is toegevoegd aan een JSplitPane. De bedoeling is nu dat de JTable zijn preferred size gebruikt en daarvoor maak ik gebruik van de FlowLayout-manager. Dat werkt allemaal nog wel. Het probleem is alleen dat ik de achtergrond rondom de table van een andere kleur wil voorzien. Als ik dan de viewport van de scrollPane de gewenste achtergrondkleur geef, dan werkt dat voor alles behalve de lijn waarop de JTableHeader geplaatst is (er loopt dus een horizontale lijn in de native-kleur rechts van de JTableHeader). Ik heb geprobeerd om de JTableHeader dan ook van dezelfde achtergrondkleur te voorzien, maar dat geeft(als logisch resultaat) dat alles, inclusief de kolommen, die kleur krijgen.

Hoe kan ik ervoor zorgen dat ik alleen die "lijn" de goede kleur geef(of verdwijnt) en dat de kolommen in de native-kleur blijven?

  • Fresh T.
  • Registratie: Februari 2002
  • Laatst online: 16:27
Om het geheel wat te verduidelijken, het ziet er als volgt uit:

Afbeeldingslocatie: http://picserver.org/view_image.php/AQ51Z55NNHVT

Het gaat nu dus om de grijze balk naast de kolommen 0 t/m 10. Die moet dezelfde kleur krijgen als het donkergrijze gebied om de tabel heen. De kolomkleuren moeten echter gewoon dezelfde kleur behouden als dat ze nu hebben, lichtgrijs dus.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

zie

  • Fresh T.
  • Registratie: Februari 2002
  • Laatst online: 16:27
Misschien dat het aan mij ligt, maar ik kan daar de oplossing nog niet tussen vinden ;(

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Fresh T. schreef op 01 augustus 2004 @ 19:31:
Misschien dat het aan mij ligt, maar ik kan daar de oplossing nog niet tussen vinden ;(
Ik dacht uit je verhaal op te maken (vond het een beetje onduidelijk), dat je een row header wilt (naast de columnheader die een jtable al standaard heeft).

Afbeeldingslocatie: http://www.senun.com/Left/Programming/Java_old/Examples_swing/images/table4.gif

[edit]
*ziet dat die idd niet goed heeft gelezen*

[ Voor 7% gewijzigd door Alarmnummer op 01-08-2004 19:38 ]


  • Fresh T.
  • Registratie: Februari 2002
  • Laatst online: 16:27
Ja sorry, probeerde zoveel mogelijk info in zo weinig mogelijk woorden uit te drukken |:(

Simpel gezegd wil ik dus die grijze balk van de jTableHeader dezelfde kleur geven als de Viewport van de JScrollPane, zonder daarbij de kleur van de kolomheaders te veranderen (0,1,...,10). Vanuit andere fora heb ik begrepen dat de tableHeader in een andere viewport verstopt zit en die met scrollpane.getColumnHeader kan opvragen en dan veranderen, maar dat werkt voor geen meter.

  • frice
  • Registratie: Januari 2001
  • Laatst online: 01-04 17:55
De code die hieronder staat zou jouw probleem voor een groot deel moeten oplossen. Alleen tussen de colommen is een klein streepje achtergrondkleur te zien:

Afbeeldingslocatie: http://www.xs4all.nl/~jongn/software/PricewatchToolsTablePart.png

De code die dit doet is alsvolgt:

Java:
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
tablePane.addComponentListener( new ComponentAdapter() {
    public void componentResized(ComponentEvent e) {
        Component c = (Component)e.getSource();
        c.removeComponentListener( this );

        class MyHeaderRenderer implements TableCellRenderer {
            TableCellRenderer origRenderer;
            Color bg;
            
            public MyHeaderRenderer(JTableHeader header) {
                this.origRenderer = header.getDefaultRenderer();
                this.bg = header.getBackground();
            }
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = origRenderer.getTableCellRendererComponent(table, value,
                        isSelected, hasFocus, row, column);
                c.setBackground( bg );
                return c;
            }
        };
        
        JTableHeader th = (JTableHeader)tablePane.getColumnHeader().getView();
        th.setDefaultRenderer( new MyHeaderRenderer(th) );
        th.setBackground( Color.GREEN );
    }
});


Ik heb het in een ComponentListener gestopt omdat een JScrollPane pas een Header krijgt als hij is getoond. Als je de code niet uitvoert in de constructor kan die weg.

Wat er gebeurt is dat de achtergrond van de header in de kleur wordt gezet die je wilt (hier groen als voorbeeld) en dat de column headers zelf de originele achtergrondkleur houden.

F

  • Fresh T.
  • Registratie: Februari 2002
  • Laatst online: 16:27
Thnx, deze oplossing werkt. Ik heb em dan nog wel in een jscrollpane staan en ervoor gezorgd dat de header vantevoren in de scrollpane gezet wordt. Zonder dat krijg je iid een null-exception.

Maar is het nou dat de kleur van de kolommen in de standaard implementatie altijd de achtergrondkleur van de ColumnHeader overneemt en dat je daardoor zelf een implementatie van TableCellRenderer moet maken? Of heeft het een andere oorzaak?

  • frice
  • Registratie: Januari 2001
  • Laatst online: 01-04 17:55
Dat is het precies. Want als je in de source van de DefaultTableCellRenderer kijkt, dan wordt de background van de JTable als background van de header cell gezet:

Java:
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
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
    
    if (isSelected) {
        super.setForeground(table.getSelectionForeground());
        super.setBackground(table.getSelectionBackground());
    }
    else {
        super.setForeground((unselectedForeground != null) ? unselectedForeground 
                                                           : table.getForeground());
        super.setBackground((unselectedBackground != null) ? unselectedBackground 
                                                           : table.getBackground());
    }
    
    setFont(table.getFont());
    
    if (hasFocus) {
        setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
        if (table.isCellEditable(row, column)) {
            super.setForeground( UIManager.getColor("Table.focusCellForeground") );
            super.setBackground( UIManager.getColor("Table.focusCellBackground") );
        }
    } else {
        setBorder(noFocusBorder);
    }
    
    setValue(value); 
    
    return this;
}


vandaar dat je die functie moet overloaden als je een andere achtergrondkleur in de header wil dan in de table.

F
Pagina: 1