# Probleme mit Java Swing unter Mac OSX



## dvid85 (18. Dez 2008)

Hallo,
ich hab ein Java Programm mit Swing Oberfläche geschrieben und es gibt anscheinend Mac-Java spezifische Probleme. Wenn ich einen Dialog öffne, z.b. Confirm, Open oder Save, dann verschwinden alle Componenten darauf. Ich sehe nur den default-makierten Button. Auch wenn ich das Main-Frame minimiere und wieder maximiere verschwinden alle Componenten darauf.
Auf Win und Linux ist das mit meinem Prog nicht so.
Für das maximieren hab ich schon eine Lösung gefunden: es gibt einen WindowStateListener, da schreibe ich einfach ein repaint() für das ganze Fenster rein.
Jedoch, wie gesagt, bei anderen Betriebssystemen ist das nicht nötig.

Die Dialoge krieg ich einfach nicht vollständig sichtbar. Kennt jemand das Problem auch? Gibt es eine Lösung?

Bitte auch ruhig antworten, wenn ihr diese Probleme nicht habt. Denn müsste ich vielleicht mal meine Java-Installation überprüfen. Obwohl, ich habs auf 3 verschiedenen Macs ausprobiert, immer das gleiche.

Gruß
David


----------



## Ebenius (19. Dez 2008)

Liegt wahrscheinlich daran, dass Du auf Linux und Windows Metal benutzt und auf dem Mac das Mac L&F. Letzteres geht besonders mit setOpaque(true) auf Windows/Frames/Dialogs ordentlich anders um. Das würde ich als allererstes prüfen.

Ebenius


----------



## dvid85 (19. Dez 2008)

Ich bin kein wirklich erfahrener Programmierer. Ich denke ich habe nicht expilizit Look & Feel genutzt. Hab nur swing sachen importiert und keinerlei Sachen auf true oder false gesetzt. Was macht setOpaque()? ich habe es auf den besagten Componenten mit true und false ausprobiert, ändert nichts.
Mir ist aber aufgefallen, dass das Verschwinden erst mit zunehmender Komponentenanzahl auftritt. Als das Main-Frame noch völlig leer war, war beim close-Dialog noch alles da.


----------



## Ebenius (19. Dez 2008)

dvid85 hat gesagt.:
			
		

> Ich bin kein wirklich erfahrener Programmierer. Ich denke ich habe nicht expilizit Look & Feel genutzt. Hab nur swing sachen importiert und keinerlei Sachen auf true oder false gesetzt. Was macht setOpaque()? ich habe es auf den besagten Componenten mit true und false ausprobiert, ändert nichts.
> Mir ist aber aufgefallen, dass das Verschwinden erst mit zunehmender Komponentenanzahl auftritt. Als das Main-Frame noch völlig leer war, war beim close-Dialog noch alles da.



Das klingt sehr sonderbar. Natürlich hast Du nicht explizit ein Look & Feel gesetzt. Auf dem Mac hast Du ganz automatisch das Mac L&F, solange Du nix setzt. Und das ist ein bisschen anders als Metal.

setOpaque(boolean) legt fest, ob eine Komponente keinen transparenten Hintergrund hat (klingt blöd, man kann auch sagen, ob sie "dicht" ist, was auch blöd klingt). Wenn damit rumspielen nix gebracht hat, wird's wohl nicht daran gelegen haben.

Speck doch mal Deinen Source-Code soweit ab wie möglich; so dass das Problem noch existiert. Dann einfach posten. Dann schaumermal.

Gruß, Ebenius


----------



## dvid85 (19. Dez 2008)

Ich habe nochmal etwas probiert:
Auf meinem Main-Frame habe ich zur Strukturgestaltung eine Box (background) gesetzt und darauf mehrere weitere Boxen. wenn ich background.setVisible(false) setze, dann verschwindet dieser auch wirklich und die Dialoge sind plötzlich sichtbar. Scheint mit den Komponenten auf dem Main-Frame zu tun zu haben. 
Weiß jetzt vielleicht jemand ne Lösung?


----------



## Ebenius (19. Dez 2008)

Ich sag's doch: nicht ohne Code. Glaub mir!


----------



## dvid85 (19. Dez 2008)

Nun ja, ich weiß nicht so recht was ich da posten soll. Das Prog hat mittlerweile über 5000 zeilen.

es sieht ungefähr so aus:


```
//... hauptMethode

                final JFrame mainFrame = getMainFrame();
		
		// Container
		background = Box.createVerticalBox();
		Box row1 = Box.createHorizontalBox();
		Box row2 = Box.createHorizontalBox(); 
		Box nextToOsc2 = Box.createVerticalBox();
		Box forInfo = Box.createHorizontalBox();
		Box lfos = Box.createHorizontalBox();
		Box envelopes = Box.createHorizontalBox();
		Box forAmp = Box.createVerticalBox();
		forAmp.setPreferredSize(new Dimension(200,350));
		forAmp.setMaximumSize(new Dimension(200,350));

//...viele weitere container
```


```
public JFrame getMainFrame(){
		final JFrame mainFrame = new JFrame("Rack Attack SysEx Editor");
		mainFrame.setSize(1020, 700);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setJMenuBar(getMenu());
		mainFrame.setResizable(false);
		mainFrame.setLocationByPlatform(true);
		mainFrame.addWindowStateListener(new WindowStateListener(){

			public void windowStateChanged(WindowEvent e) {  // das hab ich wegen dem Maximieren gemacht
				background.repaint();
				menu.repaint();
			}	
		});
		return mainFrame;
	}
```

und vielleicht noch einen Dialog:

```
//open
		final JFileChooser fcOpen = new JFileChooser();
		fcOpen.setMultiSelectionEnabled(false);
		fcOpen.setFileFilter(new FileFilter(){
			@Override
			public boolean accept(File f) {
				return f.isDirectory() || f.getName().toLowerCase().endsWith(".ras") || f.getName().toLowerCase().endsWith(".rab");
			}
			@Override
			public String getDescription() {
				return "Rack Attack Sound-File";
			}
		});
		open.setActionCommand("open");
		open.addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent e) {
				background.setVisible(false);    // Notlösung
				int returnVal = fcOpen.showOpenDialog(null);
				background.setVisible(true);    // Notlösung
//......
```

ich glaub nicht, dass ich groß was falsch gemacht habe. es kann höchstens sein, dass irgendwelche Components irgend eine setMethode brauchen oder an gewissen stellen vielleicht repaints(). Keine Ahnung, hab eigentlich schon viel probiert.
Meine Notlösung wäre jetzt, dass ich wie unten makiert vor öffnen den background aisblende und dann wieder einblende. Dann sind die Dialoge sichtbar, aber das ist ja auch nicht unbedingt Sinn der Sache.


----------



## Ebenius (19. Dez 2008)

Passiert das selbe auch, wenn Du das main frame resizable machst?


----------



## dvid85 (19. Dez 2008)

ja. ich hatte es zum anfang rezisable. dann beim minimieren und wieder maximieren ist alles verschwunden. wenn ich dann das fenster größer oder kleiner gezogen hab ist alles wieder gekommen. das komische ist ja, dass es nur aufm mac nicht geht. ich hab auch schon versucht andere java compiler zu benutzen, erfolglos.


----------



## Ebenius (19. Dez 2008)

Ich kann's mit meinen Programmen auf nem Mac OS-X Java 1.5.0_16 nicht nachvollziehen.

Kannst Du auf einer der Kisten mit Eclipse* arbeiten? Wenn ja, setz Dir einen Breakpoint in Window.processEvent(AWTEvent) an das WINDOW_STATE_CHANGED case-Label. Und dann quäl Dich durch.

// EDIT: * oder welche IDE auch immer Dir gefällt...

Viel Erfolg!


----------



## dvid85 (20. Dez 2008)

danke für deine hilfe, aber ich glaube das bringt alles nichts. hab jetzt ein paar tricks eingebaut mit denen es funktioniert. ist etwas unschön, aber naja.. hauptsache der user merkt es nicht.
hoffe nur, dass es jetzt auf anderen plattformen auch funktioniert.


----------



## dvid85 (20. Dez 2008)

achja, falls jemand die gleichen probleme hat, bitte melden. ich würde denn meine tricks posten


----------



## Hollebolle (19. Mrz 2009)

Hallo dvid85,

ich habe genau die gleichen Probleme, auf Windows und Linux läuft es, aber unter Mac OS X gibt es die von dir beschriebenen Probleme. Kannst Du mir deine Tricks nennen? 

Grüße


----------



## Hollebolle (19. Mrz 2009)

Jetzt habe ich selbst noch ein wenig herumprobiert, und es geht jetzt recht zufriedenstellend.

Ich habe dem JFrame einen WindowListener und WindowStateListener spendiert.

In den zugehörigen Methoden windowOpened und windowStateChanged mache ich auf alle JPanels der contentPane ein repaint().

Viele Grüße


----------

