LookAndFeel Nimbus TabbedPane Backgroundcolor

C

Camino

Gast
Hallo,

ich hab bei meiner Swing-Anwendung das Nimbus-L&F eingestellt. Nun bekomme ich es irgendwie nicht hin, bestimmte Tabs in einer JTabbedPane mit einem farbigen Hintergrund zu versehen. D.h. ich hab mehrere Tabs offen und möchte, dass bei bestimmten Werten die Tabs eine andere Hintergrundfarbe haben, damit sie sich von den anderen Tabs unterscheiden. Eine Hintergrundfarbe (mit setBackground oder setBackgroundAt) nehmen die Tabs in Nimbus eh nicht an. Ich hab irgendwo gelesen, dass Nimbus die Farben in UIManager properties speichert. Aber wenn ich da was ändern würde, wären ja alle Tabs betroffen (auch bei anderen JTabbedPanes, bei denen ich diese Farben nicht setzen möchte). Gibt es eine Möglichkeit, auch unter Nimbus die Hintergrundfarbe für einzelne Tabs zu setzen?

Im Moment hab ich eine Variante eines TabComponent mit einem JLabel und einem Close-Button. Auf dem JLabel steht der Text, dem ich eine Vorder- und Hintergrundfarbe geben kann. Das mit der Vordergrundfarbe klappt ja auch ganz gut, nur bei der gesetzten Hintergrundfarbe ist nur ein farbiger Kasten um den Text herum (wohl das JLabel), aber nicht der komplette Tab. Sieht halt ein bisschen unschön aus. Na ja, vielleicht hat ja wer ne bessere Idee oder Tipps, wie man das am besten hinkriegt.

Gruss
Camino
 
C

Camino

Gast
Hallo,

danke für die Links. Hab mir das mal angeschaut, aber irgendwie komm ich da auch nicht weiter. In der Übersicht der Komponenten für Nimbus gibt es ja auch einen Abschnitt für TabbedPanes. Viele der Werte erwarten jedoch ein Painter-Objekt, welches "mein" Java nicht kennt, weil es in com.sun.java.swing.Painter liegt. Nimbus ist ja mittlerweile direkt in Java integriert, Painter soll erst in Java 7 dazukommen. Hab ich nach kurzer Recherche so im Internet gefunden. Vielleicht kann mir ja mal wer sagen, ob und wie das mit der Hintergrundfarbe der Tabs bei Nimbus geändert werden kann. Also, am besten für einzelne (bestimmte) Tabs, und nicht grundsätzlich für alle Tabs in der ganzen Anwendung.

Hier mal mein Code zum Testen:
Java:
import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIDefaults;
import javax.swing.UIManager;


public class TabTest {
	
	private JFrame frame;
	private JTabbedPane tabbedPane;

	public TabTest() {
		
		frame = new JFrame();
		frame.setTitle( "Nimbus TabbedPane Test" );
		frame.setSize( 600, 400 );
		
		tabbedPane = new JTabbedPane();
		tabbedPane.addTab( "Tab 1", new JPanel() );
		tabbedPane.addTab( "Tab 2", new JPanel() );
		tabbedPane.addTab( "Tab 3", new JPanel() );
		tabbedPane.addTab( "Tab 4", new JPanel() );
		tabbedPane.addTab( "Tab 5", new JPanel() );
		
		UIDefaults tabDefaults = new UIDefaults();

        tabDefaults.put( "TabbedPane.background", Color.WHITE );     // klappt nicht?!
        tabDefaults.put( "TabbedPane:TabbedPaneTab[Focused+Pressed+Selected].textForeground", Color.RED );     // funktioniert!

        tabbedPane.putClientProperty( "Nimbus.Overrides", tabDefaults );
        tabbedPane.putClientProperty( "Nimbus.Overrides.InheritDefaults", false );

		frame.add( BorderLayout.CENTER, tabbedPane );

		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		frame.setVisible( true );

	}
	
	

	public static void main( String[] args ) {

		try {
			UIManager.setLookAndFeel( ("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel") );
		} catch( Exception e ) {
			e.printStackTrace();
		}
   
		javax.swing.SwingUtilities.invokeLater( new Runnable() {
		      public void run() {
		    	  new TabTest();
		      }
	    });

	}

}

[/JAVA
 
C

Camino

Gast
Zu Nimbus hab ich auch noch folgende Meldung gefunden:


09.11.2010 09:35
Nimbus-Design in JDK 7

Das Nimbus-Look-and-Feel für Swing gibt es seit dem JDK 6u10. Es wurde damals als Nachfolger für den alten Metal-Look eingeführt. Die Nimbus-Optik gab es allerdings nur als proprietäre Erweiterung (com.sun.java.swing). Oracle hat nun beschlossen, Nimbus als Standard-API (javax.swing) mit dem JDK 7 auszuliefern. Es wird dort allerdings nicht als Standard-Look-and-Feel in Erscheinung treten, da das zum Bruch mit zu vielen Abhängigkeiten bestehender Applikationen führe. Eine Umfrage unter Java-Entwicklern hatte als Ergebnis gezeigt, dass diese den Nimbus-Look deutlich gegenüber der Metal-Optik bevorzugen würden.

Quelle: heise Developer
Nimbus-Design in JDK 7 | heise Developer


Bedeutet dies nun, dass es vielleicht besser ist (bzw. notwendig), mit solchen Änderungen oder Anpassungen am Nimbus-Layout zu warten, bis Java 7 draussen ist?
 

slawaweis

Bekanntes Mitglied
normalerweise geht es mit setBackgroundAt() und setForegroundAt(). Wenn das PLAF diese Werte ignoriert, hilft das Setzen des setTabComponentAt() für jedes Tab.

Slawa
 
C

Camino

Gast
Hallo,

setBackgroundAt() wird von Nimbus ignoriert, deshalb frage ich ja auch hier. Und bei setTabComponentAt(): was muss ich da denn bei Component setzen?

Ah, OK, hab's gerade selbst herausgefunden: mit setTabComponentAt kann ich z.B. ein JLabel setzen, welches dann bei dem Tab im Anzeigenbereich angezeigt wird. Mir ging es aber um den Reiter oben bei den Tabs. Den hätte ich gerne mit einer Hintergrundfarbe belegt... (Sorry, falls ich mich falsch ausgedrückt hatte)
 
Zuletzt bearbeitet von einem Moderator:

slawaweis

Bekanntes Mitglied
Ah, OK, hab's gerade selbst herausgefunden: mit setTabComponentAt kann ich z.B. ein JLabel setzen, welches dann bei dem Tab im Anzeigenbereich angezeigt wird. Mir ging es aber um den Reiter oben bei den Tabs. Den hätte ich gerne mit einer Hintergrundfarbe belegt... (Sorry, falls ich mich falsch ausgedrückt hatte)
die Komponente im Anzeigebereich setzt man über setComponentAt(). Über setTabComponentAt():

JTabbedPane (Java Platform SE 6)

setzt man die Komponente, welche den Reiter zeichnet, z.B. ein JLabel.

Slawa
 
C

Camino

Gast
Hmm, wenn ich folgendes mache:

Java:
JLabel tabLabel = new JLabel("Test-Tab");
tabLabel.setOpaque(true);
tabLabel.setBackground( Color.WHITE );

tabbedPane.setTabComponentAt(1, tabLabel);

Dann ist in dem 2. Tab (Reiter) ein weisser Kasten nur um den Titel ("Test-Tab") herum, der restliche Reiter hat den Hintergrund wie die anderen Reiter, also wie der Standard von Nimbus. Ich hätte halt gerne, dass die weisse Farbe den kompletten Reiter ausfüllt.
 
C

Camino

Gast
So wie es in den Nimbus-Defaults beschrieben steht und ich verstanden habe, werden für die Tabs (Reiter) wohl Painter-Objekte (com.sun.java.swing) eingesetzt, welche aber noch nicht standardmäßig in Java integriert sind (erst ab Java 7).
 

slawaweis

Bekanntes Mitglied
ich kenne mich mit Nimbus leider nicht viel aus, ich benutze Substance. Rein theoretisch gesehen, würde ein gutes PLAF über Client-Properties steuerbar sein, also über putClientProperty() und getClientProperty(). Doch man muss bedenken, dass man damit die Programmlogik in das PLAF auslagert. Würde z.B. ein anderes PLAF eingesetzt, würden die farbigen Informationen verschwinden. Deshalb gehören solche Sachen nicht in das PLAF. Ich würde deswegen bei setTabComponentAt() bleiben und vielleicht die Ecken der eigenen Komponente abrunden, damit es schöner aussieht.

Slawa
 
C

Camino

Gast
Na ja, ich hatte halt irgendwann entdeckt, dass Nimbus in Java direkt integriert wurde und es mal ausprobiert. Fand ich halt ansprechender, als die vorherigen verfügbaren L&Fs. Ich hatte da auch bisher nie irgendwas direkt an Nimbus ändern wollen/müssen. Die meisten Sachen konnte ich im Java-Code direkt angeben und ändern. Bin jetzt erst darauf gekommen, als ich die Hintergrundfarbe der Tabs verändern wollte, und das über die Standard-Java-Methoden nicht klappte.

Ich hab auch schonmal gewechselt zum System-L&F. Sah dann schon etwas seltsam und ungewohnt aus. Muss ich mir jetzt wohl überlegen, ob ich bei Nimbus bleibe und die Mängel erstmal hinnehme (ich denke mal, mit Java 7 wird sich da auch ein bisschen was ändern), oder ob ich zum System-L&F übergehe und dafür mehr Möglichkeiten zum Einstellen und Gestalten habe.

Danke jedenfalls für deine Antworten...

Viele Grüsse
Camino
 

slawaweis

Bekanntes Mitglied
ich habe etwas mit Nimbus experimentiert. So sieht es aus, wenn man es mit setTabComponentAt() probiert:

attachment.php


wenn man allerdings das PLAF-Property "TabbedPane:TabbedPaneTab.contentMargins" überschreibt, kann man das erreichen:

attachment.php


Die Properties sind hier aufgelistet (nach "TabbedPane" suchen):

Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)

Damit kann man versuchen sein Wunschaussehen zu erreichen. Quelltext:

Java:
package coloredtabs;

import java.awt.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;

public class ColoredTabs
{
 public static void main(String [] args)
  {
  try
     {
     UIManager.setLookAndFeel(
         "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
       );
     }
  catch(Exception e) { e.printStackTrace(System.err); }

  // mit den folgenden Zeilen kann man den Abstand im Tab-Reiter
  // zu seiner eigenen Komponente regeln
  UIManager.getLookAndFeelDefaults().put(
      "TabbedPane:TabbedPaneTab.contentMargins",
      new InsetsUIResource(0, 0, 0, 0)
    );

  JTabbedPane tabs = new JTabbedPane();
  tabs.addTab("Tab 1", new JPanel());
  tabs.addTab("Tab 2", new JPanel());
  tabs.addTab("Tab 3", new JPanel());

  JLabel l1 = new JLabel("Tab 1");
  l1.setBorder(new EmptyBorder(0, 4, 0, 0));
  l1.setBackground(new Color(255, 100, 100));
  l1.setForeground(Color.white);
  l1.setOpaque(true);
  l1.setPreferredSize(new Dimension(50, 20));
  tabs.setTabComponentAt(0, l1);

  TabLabel tl = new TabLabel("Tab 2");
  tl.setBorder(new EmptyBorder(0, 4, 0, 0));
  tl.setBackground(new Color(180, 180, 255));
  tl.setForeground(Color.white);
  tl.setPreferredSize(new Dimension(50, 20));
  tabs.setTabComponentAt(1, tl);

  JFrame frame = new JFrame("Colored Tabs");
  frame.setSize(300, 100);
  frame.setLocationRelativeTo(null);
  frame.add(tabs);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
  }

 public static class TabLabel extends JLabel
 {
  public TabLabel(String text)
   {
   super(text);
   }

  @Override
  public void paintComponent(Graphics g)
   {
   Graphics2D g2 = (Graphics2D)g;
   Dimension size = getSize();

   LinearGradientPaint fill = new LinearGradientPaint(
       new Point(0, 0),
       new Point(0, size.height),
       new float [] { 0.0f, 1.0f },
       new Color [] { getBackground(), getBackground().darker() }
     );

   g2.setPaint(fill);
   g2.fillRoundRect(0, 0, size.width-1, size.height-1, 10, 10);

   super.paintComponent(g);
   }
 }
}

Slawa
 

Anhänge

  • colored-tabs-01.png
    colored-tabs-01.png
    8,4 KB · Aufrufe: 77
  • colored-tabs-02.png
    colored-tabs-02.png
    7,6 KB · Aufrufe: 80
C

Camino

Gast
Hallo,

danke für die Experimente. Die Auflistung hatte ich ja auch schon gefunden. Ich denke, das grösste Problem ist, dass die Tabs bei Nimbus mit Painter-Objekten (wahrscheinlich Vektor-Grafiken) erstellt werden, und nicht einfach eine Farbe zugeordnet werden kann. Das wäre ja ansonsten die beste Lösung. So wie du das nun gemacht hast, sieht es zwar schon besser aus, aber leider immer noch nicht ganz perfekt. Das liesse sich bestimmt noch verfeinern. Aber wie du schon geschrieben hattest, könnte es problematisch werden, wenn man irgendwann mal das L&F wechselt. Mal schauen, ob ich da weiter dran rumbastel oder dann doch lieber auf die Farbeffekte verzichte oder vielleicht ganz auf Nimbus verzichte.

Camino
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
M JTabbedPane verändern mit Nimbus Look and Feel AWT, Swing, JavaFX & SWT 1
V LookAndFeel JSpinner Hintergrund Farbe mit Nimbus LaF AWT, Swing, JavaFX & SWT 0
H Nimbus ProgressBar Colors AWT, Swing, JavaFX & SWT 9
H Nimbus L&F TitledBorder AWT, Swing, JavaFX & SWT 2
V Nimbus Look and Feel register Region problem AWT, Swing, JavaFX & SWT 5
V Nimbus Look And Feel Button textForeground AWT, Swing, JavaFX & SWT 8
M jTabbedPain und Nimbus AWT, Swing, JavaFX & SWT 4
T Nimbus JButton: Zeilenumbruch korrigieren? AWT, Swing, JavaFX & SWT 9
N Nimbus Look & Feel AWT, Swing, JavaFX & SWT 4
hdi LookAndFeel Nimbus BUG mit JTabbedPane?! AWT, Swing, JavaFX & SWT 5
Y LookAndFeel Nimbus einschalten geht nicht AWT, Swing, JavaFX & SWT 31
V Swing Nimbus Look And Feel verschiedene Buttons AWT, Swing, JavaFX & SWT 8
A LookAndFeel Rollover Effekt bei JTabbedPane deaktivieren (Nimbus) AWT, Swing, JavaFX & SWT 8
B LookAndFeel Cell Renderer für JTable bei Nimbus Look and Feel AWT, Swing, JavaFX & SWT 2
T Nimbus Überschrift AWT, Swing, JavaFX & SWT 10
P LookAndFeel nimbus JLabel undurchsichtig opaque funktioniert nicht AWT, Swing, JavaFX & SWT 4
R LookAndFeel Nimbus ändert Programmausführung AWT, Swing, JavaFX & SWT 8
Y LookAndFeel JTabbedPane: Tab-Farbe mit Nimbus setzen AWT, Swing, JavaFX & SWT 3
N Swing Nimbus arbeitet nicht korrekt korrekt bei setEnabled() für JMenuItem AWT, Swing, JavaFX & SWT 2
S Metal-Buttons so aussehen lassen wie Nimbus Buttons? AWT, Swing, JavaFX & SWT 3
Fu3L Keine Transparenten JTextComponents möglich mit Nimbus L&F? AWT, Swing, JavaFX & SWT 5
S Swing JTable in Nimbus AWT, Swing, JavaFX & SWT 4
O nimbus Abbrechen ok vertauscht AWT, Swing, JavaFX & SWT 2
E Look & Feel - Nimbus AWT, Swing, JavaFX & SWT 12
A Nimbus eigener Painter funzt nicht AWT, Swing, JavaFX & SWT 11
data89 Nimbus Look and Feel als gepackte JAR-Datei AWT, Swing, JavaFX & SWT 3
T Swing: TaskPane mit Nimbus LnF? AWT, Swing, JavaFX & SWT 4
M Problem Nimbus Look&Feel AWT, Swing, JavaFX & SWT 2
oliver1974 Nimbus Look & Feel und die Ausgaben nach Standardaus. AWT, Swing, JavaFX & SWT 4
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
D Swing Java TabbedPane AWT, Swing, JavaFX & SWT 2
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
B IconImage update im Tabbedpane AWT, Swing, JavaFX & SWT 3
OnDemand TabbedPane und ein Button AWT, Swing, JavaFX & SWT 8
W Swing TabbedPane - Grafikbug (weisse Strich) AWT, Swing, JavaFX & SWT 3
C JList update über tabbedPane? AWT, Swing, JavaFX & SWT 18
S TabbedPane ohne Rand AWT, Swing, JavaFX & SWT 4
G tabbedpane ausrichtung der reiter AWT, Swing, JavaFX & SWT 4
G Control für Tabreiter (TabbedPane) AWT, Swing, JavaFX & SWT 8
C TabbedPane mit falschem Inhalt. AWT, Swing, JavaFX & SWT 2
A JList wir nicht in TabbedPane angezeigt! AWT, Swing, JavaFX & SWT 4
Y TabbedPane AWT, Swing, JavaFX & SWT 3
Y Backgroundcolor JMenu AWT, Swing, JavaFX & SWT 2
O Swing JTextField Backgroundcolor kurzzeitig ändern AWT, Swing, JavaFX & SWT 3
S Swing BorderLayout + Backgroundcolor AWT, Swing, JavaFX & SWT 3
A Backgroundcolor JTextField AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben