# Look & Feel und JSplitPane Problem



## harry_t (6. Sep 2008)

Hallo,

ich möchte diese JSplitPane benutzen und nutze für Look & Feel

UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); 

An sich funktioniert auch fast alles, außer die OneTouchExpandable Buttons sind nicht vorhanden.

Diese Buttons sehe ich  nur wenn ich das Standard Java Look & Feel benutze.

Gibt es eine Möglichkeit, manuell kleine Buttons an diese JSplitPane "anzubringen" die eben diese OneTouchExpandable Funktionalität unterstützen.


----------



## Gast (6. Sep 2008)

Dazu müsste man wissen welches Betriebssystem bei dir läuft. Es kann sein, dass die Knöpfe bei bestimmen Betriebssystemen standardmäßig deaktiviert sind. Wobei ich sie hier sowohl unter MacOS als auch unter Windows sehe.

Ansonsten: Versuch doch mal die Knöpfe mit
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JSplitPane.html#setOneTouchExpandable(boolean)
einzuschalten.


----------



## Guest (6. Sep 2008)

Hallo,

danke für die schnelle Antwort.

ich nutze Linux. Diese OneTouch... Option steht auf true..

Scheint also ein Betriebssystem abhängige Sache zu sein.. na dann werde ich da mal etwas nachforschen ..


----------



## Guest (6. Sep 2008)

Komisch, 
bei mir funktionierts:





Hier der Quellcode dazu:

```
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DemoTest extends JFrame{

	public DemoTest(){
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		setLayout(new BorderLayout());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JSplitPane split = new JSplitPane();
		split.setOneTouchExpandable(true);
		
		add(new JScrollPane(split),BorderLayout.CENTER);

		pack();
		setSize(400,300);
		setVisible(true);
	}
	
	
	public static void main(String[] args) {
		new DemoTest();
	}

}
```

Wobei es IMHO für Linux ja gar kein Native-Look-And-Feel gibt, also sowieso das Standard-Java Cross-Platform-L&F verwendet wird. (wie auch oben zu sehen).


----------



## L-ectron-X (6. Sep 2008)

Wahrscheinlich liegts an der Divider-Breite. Ist er zu schmal, werden die Pfeile nicht angezeigt.


----------



## harry_t (6. Sep 2008)

L-ectron-X hat gesagt.:
			
		

> Wahrscheinlich liegts an der Divider-Breite. Ist er zu schmal, werden die Pfeile nicht angezeigt.



Leider nein, egal wie groß die Knöpfe erscheinen leider nicht.



> Wobei es IMHO für Linux ja gar kein Native-Look-And-Feel gibt, also sowieso das Standard-Java Cross-Platform-L&F verwendet wird. (wie auch oben zu sehen).



Bei mir nicht. Soweit mir bekannt ist, wird seit Java6, dass Aussehen des OS übernommen

Dein Beispiel sieht bei mir so aus:


----------



## Gast (7. Sep 2008)

Poste doch mal bitte folgende Infos:
- Welches Linux verwendest du?
- Welches L&F verwendest du?

Hier der code dazu:

```
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test extends JFrame{
   public Test(){
	   JLabel label=null;JLabel label2 = null;
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
         label = new JLabel(UIManager.getSystemLookAndFeelClassName());
         label2 = new JLabel(System.getProperty("os.name"));
      } catch (ClassNotFoundException e) {e.printStackTrace();
      } catch (InstantiationException e) {e.printStackTrace();
      } catch (IllegalAccessException e) {e.printStackTrace();
      } catch (UnsupportedLookAndFeelException e) {e.printStackTrace();
      }    
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JSplitPane split = new JSplitPane();
      split.setOneTouchExpandable(true);
      add(label,BorderLayout.NORTH);
      add(label2,BorderLayout.SOUTH);
      add(new JScrollPane(split),BorderLayout.CENTER);
      pack();
      setSize(400,300);
      setVisible(true);
   }
   public static void main(String[] args) {
      new Test();
   }
}
```


----------



## harry_t (7. Sep 2008)

Linux: Archlinux 06/2008  und Ubuntu 8.04 beides mit GNOME Oberfläche

L&F: com.sun.java.swing.plaf.gtk.GTKLookAndFeel


----------



## Gast (7. Sep 2008)

Dann haben wir ja den Übeltäter: Anscheinend unterstützt das GTK L&F die von dir gewünschte Funktion nicht. 

Bei meinem Linux wird nämlich das Cross-Platform L&F verwendet.

Du kannst jetzt folgendes machen, falls die Anwendung auf verschiedenen Systemen eingesetzt wird: Einfach eine simple if-Abfrage, falls das native L&F das GTK wäre, dann verwende das Cross-Platform L&F ansonsten verwende das native L&F.


----------



## harry_t (8. Sep 2008)

Hey danke für die Mühen.. na dann werde ich das wohl erstmal so umsetzen


----------



## Wildcard (8. Sep 2008)

Gast hat gesagt.:
			
		

> Du kannst jetzt folgendes machen, falls die Anwendung auf verschiedenen Systemen eingesetzt wird: Einfach eine simple if-Abfrage, falls das native L&F das GTK wäre, dann verwende das Cross-Platform L&F ansonsten verwende das native L&F.


Ist es das Wert? Solange keine wichtige Funktion ausfällt, lieber das System Look and Feel.


----------



## Gast (8. Sep 2008)

Würde auch immer auf das System L&F zurückgreifen, aber anscheinend ist für harry_t dieser Knopf ja sehr wichtig.


----------



## Wildcard (8. Sep 2008)

Dann vielleicht eher im Falle des GTK Look and Feels eine eigene Implementierung verwenden die den Divider um zwei Knöpfe erweitert.


----------



## Gast (8. Sep 2008)

Wobei ich das eh komisch finde mit dem GTK. Unter Linux gibts halt mal kein einheitliches L&F da kann man gleich auf das von Sun zurückgreifen.


----------



## Wildcard (9. Sep 2008)

Was findest du daran komisch? Unter Linux gibt es kein einheitliches Look and Feel, weil jeder die freie Wahl hat welchen Fenstermanager er verwenden will. Linux Anwender mögen es eben die Wahl zu haben. Das bedeutet jedoch nicht, das man als Entwickler diese Wahl einfach ignorieren soll.


----------



## harry_t (9. Sep 2008)

Wildcard hat gesagt.:
			
		

> Dann vielleicht eher im Falle des GTK Look and Feels eine eigene Implementierung verwenden die den Divider um zwei Knöpfe erweitert.



Das ist eine gute Idee.. aber wie setze ich diese genau um. Du hast nicht rein zufällig ein kleines Beispiel, wo genau das realisiert wird ?


Ansonsten... wusste ich nicht das es unter Linux kein einheitliches L&F gibt. Da ich ausschliesslich Gnome somit GTK verwende... und mit java 6 dann die Programme alle so aussahen wie Systemeigene, dachte ich das seitens Sun da irgendwas Neues, Großartiges implementiert wurde, was eben genau das systeminterne L&F nimmt.. unabhängig vom verwendeten Fenstermanager und Betriebssystem.. nagut wieder was dazu gelernt


----------



## Wildcard (9. Sep 2008)

Schau dir mal die BasicSplitPaneDivider Klasse an. Das Verhalten sollte sich mit etwas Handarbeit einbauen lassen.


> Ansonsten... wusste ich nicht das es unter Linux kein einheitliches L&F gibt.


Sun hat eher ein Augenmerk auf Gnome, wegen Solaris. So ein Look and Feel erstellt man leider nicht innerhalb von 3 Wochen und bei der Vielzahl der Window Manager für Linux wird es dann schwierig (Gnome, KDE, Fluxbox, XFCE,...).
Möglicherweise gibt es für einen Teil dieser Windowmanager eine externe Implementierung. Sun Java verwendet bei GTK das GTK Look and Feel, ansonsten aber Cross Plattform.


----------



## Wildcard (9. Sep 2008)

Mit ein wenig Glück genügt es auch mit UIDefaults das Property SplitPane.supportsOneTouchButtons auf Boolean.TRUE zu setzen. Muss man versuchen...


----------

