2010-01-22 17 views
6

Sto diventando pazzo cercando di capirlo.Controllo del colore nel pannello a schede Java

Sto provando a elimenare uno sfondo blu chiaro che appare in un JTabbedPane. Ho provato tutto e niente sembra funzionare.

Di seguito è riportato il mio codice. Se lo esegui, mostrerà la scheda, se selezionata con uno sfondo azzurro e un bordo blu in alto. Voglio controllare questo colore. Ma come?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.plaf.ColorUIResource; 
public class Main extends JFrame { 
    JTabbedPane tab=new JTabbedPane(); 
    public Main() { 
    setSize(300,300); 
    setTitle("Test Tab pane"); 
    tab.add("First",new myPanel("First")); 
    tab.add("Second",new myPanel("Second")); 
    tab.add("Third",new myPanel("Third")); 
    tab.add("Fourth",new myPanel("Fourth")); 
    tab.addChangeListener(new ChangeTab()); 
    getContentPane().add(tab,BorderLayout.CENTER); 
    setVisible(true); 
    for(int i=0;i<tab.getTabCount();i++){ 
      if(i != tab.getSelectedIndex()) 
      tab.setBackgroundAt(i,Color.orange); 
      tab.setForeground(Color.BLACK); 
    } 
    tab.setOpaque(true); 
    UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN); 
    UIManager.put("TabbedPane.selected",ColorUIResource.GREEN); 
    UIManager.put("TabbedPane.background",ColorUIResource.GREEN); 
    UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN); 
    } 

    public static void main(String[] args) { 
    Main main = new Main(); 
    } 

    class ChangeTab implements ChangeListener{ 
    public void stateChanged(ChangeEvent e){ 
     tab.validate(); 
     System.out.println(tab.getSelectedIndex()); 
     for(int i=0;i<tab.getTabCount();i++){ 
      if(i != tab.getSelectedIndex()) 
      tab.setBackgroundAt(i,Color.orange); 
     } 

    } 
    } 

    class myPanel extends JPanel{ 
    public myPanel(String str){ 
     add(new JLabel(str)); 
    } 
    } 

} 
+0

Hai provato a utilizzare un diverso LookAndFeel o l'uso di 'UIManager.put' prima di visualizzare' JFrame'? –

risposta

9

Ho usato il codice di esempio, e che cosa ha funzionato per me stava muovendo le chiamate per UIManager.put() ad un punto in cui sarebbero stati eseguiti prima del costruttore JTabbedPane era eseguito.

public class Main extends JFrame { 
    JTabbedPane tab; 

    public Main() { 
     // ... other stuff 
     UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN); 
     UIManager.put("TabbedPane.selected",ColorUIResource.GREEN); 
     UIManager.put("TabbedPane.background",ColorUIResource.GREEN); 
     UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN); 

     // now construct the tabbed pane 
     tab=new JTabbedPane(); 

     // ... other stuff 
} 

Ci sono anche alcuni altri immobili disponibili (per il metallo L & F, almeno):

UIManager.put("TabbedPane.borderColor", Color.RED); 
UIManager.put("TabbedPane.darkShadow", ColorUIResource.RED); 
UIManager.put("TabbedPane.light", ColorUIResource.RED); 
UIManager.put("TabbedPane.highlight", ColorUIResource.RED); 
UIManager.put("TabbedPane.focus", ColorUIResource.RED); 
UIManager.put("TabbedPane.unselectedBackground", ColorUIResource.RED); 
UIManager.put("TabbedPane.selectHighlight", ColorUIResource.RED); 
UIManager.put("TabbedPane.tabAreaBackground", ColorUIResource.RED); 
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.RED); 

Questi consentono di controllare la maggior parte dei colori nella zona scheda.

Ho trovato con queste impostazioni c'era ancora un bordo grigio blu molto piccolo intorno al contenuto. Ho cercato come impostare questo colore inutilmente. L'unica soluzione che sono riuscito a trovare è stata:

UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); 

Quale è una soluzione non ottimale.

+0

In realtà, questo funziona per me. Perché lo chiami in modo non ottimale? – Elliott

+0

Perché, e non ne sono sicuro, farà in modo che il contenuto della scheda si appoggi contro i bordi. Per esempio. se si dispone di un componente, ad esempio un pulsante nell'area Nord, la parte superiore del pulsante toccherà la parte superiore della scheda, che probabilmente non è ciò che si desidera quando si preferisce semplicemente controllare il colore. – Grundlefleck

+0

Sì. Ci ho pensato, ma sono stato in grado di affrontarlo mettendo un bordo intorno all'area del contenuto del contenitore a cui si accede da TabbedPane. Il bordo che non è una proprietà di JTabbedPane stesso ma del contenitore. Quel Border è completamente controllabile da me e quindi risolve il problema (anche se, ammettiamolo, non è la soluzione più elegante). Ma poi di nuovo, nemmeno la implzione di questo controllo Swing. – Elliott

0

Tentativo 2: ho risolto il mio problema di confine e ha cambiato look and feel manager. Questo non è ancora esattamente quello che stai cercando però ..

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.plaf.ColorUIResource; 
public class Main extends JFrame { 
    JTabbedPane tab=new JTabbedPane(); 
    public Main() { 

    setBackground(Color.white); 
    setSize(300,300); 
    setTitle("Test Tab pane"); 
    tab.add("First",new myPanel("First")); 
    tab.add("Second",new myPanel("Second")); 
    tab.add("Third",new myPanel("Third")); 
    tab.add("Fourth",new myPanel("Fourth")); 
    tab.addChangeListener(new ChangeTab()); 
    tab.setBackground(Color.white); 
    tab.setForeground(Color.black); 
    tab.setBorder(BorderFactory.createEmptyBorder()); 


    getContentPane().add(tab,BorderLayout.CENTER); 
    setVisible(true); 

    } 

    public static void main (String[] args) throws Exception { 
          UIManager.setLookAndFeel(
      UIManager.getSystemLookAndFeelClassName()); 
    Main main = new Main(); 
    } 

    class ChangeTab implements ChangeListener{ 
    public void stateChanged(ChangeEvent e){ 
     tab.validate(); 
     System.out.println(tab.getSelectedIndex()); 

    } 
    } 

    class myPanel extends JPanel{ 
    public myPanel(String str){ 
     setBackground(Color.white); 
     setBorder(BorderFactory.createEmptyBorder()); 
     add(new JLabel(str)); 
    } 
    } 

} 
+0

'setBorder()' accetta un javax.swing.border.Border, non un oggetto Color. Il colore è invece preso dall'oggetto Border? – Grundlefleck

+0

Qualcuno ha postato la risposta ma ora non c'è più. Perché? bug in StackOverflow? Il anwwer è di impostare i parametri in UIManager prima di creare l'oggetto. Fallo al contrario e il codice non funziona. – Elliott

+0

@Elliot: l'ho eliminato io stesso perché non risolve il problema, solo una parte di esso. Vedo ancora il bordo grigio blu attorno al pannello interno. Anche usando questa risposta pure. – Grundlefleck

2

Controllare i risultati con questi valori.

UIManager.put("TabbedPane.contentAreaColor", Color.GREEN); 
UIManager.put("TabbedPane.light", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.highlight", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.shadow", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.darkShadow", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.selected", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.GREEN); 

Come si può vedere, l'unico modo, per ottenere il bordo scuro sulla parte superiore del pannello il colore che si desidera è di impostare "borderHightlightColor" per il colore desiderato. Sfortunatamente, questo ha gli effetti collaterali che possono essere visti (bordo verde attorno a tutte le schede). Eppure, c'è questa linea grigia tra quelle verdi che provengono dallo sfondo.

Penso che l'unica vera soluzione a questo sia l'override di MetalTabbedPaneUI. Se si imposta solo contentAreaColor e fare le sostituzioni vuoti per i metodi

paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h); 
paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h); 
paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h); 
paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h); 

il risultato dovrebbe essere vicino a quello ho il sospetto che si desidera ottenere.

Problemi correlati