# Gestaltung eines Optionen-Dialog



## beastofchaos (25. Jul 2011)

Hallöle Leute,
Ich erarbeite für mein Programm gerade einen JDialog, mittels dem man einige wichtige Optionen meines Malprogramms einstellen kann. Hier mal der Code der Klasse, die das verwaltet.


```
package window;

import internationalization.Languages;

@SuppressWarnings("serial")
public class SettingsDialog{
	private JDialog dialog;
	private Main main;
	
	public SettingsDialog(Main target){
		main = target;
		dialog = new JDialog();
		dialog.setSize(400, 400);
		Main.centerWindow(dialog);
		dialog.setContentPane(new OptionsDialogPanel());
	}
	
	public void showDialog(){
		dialog.setVisible(true);
	}
	
	
	private class OptionsDialogPanel extends JPanel{
		JButton buttonOk;
		JButton buttonCancel;
		JButton buttonActualize;
		
		JCheckBox checkChangeActual;
		JComboBox comboLanguages;
		JCheckBox checkDisableLeft;
		JCheckBox checkDisableLower;
		
        private OptionsDialogPanel(){
            super(new BorderLayout());
            
            JPanel centerPanel = new JPanel(new GridBagLayout());
            initCenterPanel(centerPanel);
            add(centerPanel, BorderLayout.CENTER);
            
            JPanel lowPanel = new JPanel(new GridBagLayout());
            initLastPart(lowPanel);
            add(lowPanel, BorderLayout.SOUTH);
            
            initSettings();
        }
        
        private void initCenterPanel(JPanel target){
        	JLabel labelLanguages = new JLabel(Languages.get("Language"));
        	comboLanguages = new JComboBox(Languages.isThere);
        	
        	JLabel labelDisableLeft = new JLabel(Languages.get("DisableLeftSide"));
        	checkDisableLeft = new JCheckBox();
        	
        	JLabel labelDisableLower = new JLabel(Languages.get("DisableLowerSide"));
        	checkDisableLower = new JCheckBox();
        	
        	JLabel labelChangeActual = new JLabel(Languages.get("ChangeActual"));
        	checkChangeActual = new JCheckBox();
        	
        	//------------------------------------------------------------------
            GridBagConstraints cons = new GridBagConstraints();
            
            cons.weightx = 1.0;
            cons.insets = new Insets(5, 5, 5, 5);
            cons.gridheight = 1;
            cons.gridwidth = GridBagConstraints.RELATIVE;
            cons.anchor = GridBagConstraints.WEST;
            target.add(labelLanguages, cons);
            cons.gridwidth = GridBagConstraints.REMAINDER;
            target.add(comboLanguages, cons);
            
            target.add(new JLabel(" "), cons);
            
            cons.gridwidth = GridBagConstraints.RELATIVE;
            target.add(labelDisableLeft, cons);
            cons.gridwidth = GridBagConstraints.REMAINDER;
            target.add(checkDisableLeft, cons);
            
            cons.gridwidth = GridBagConstraints.RELATIVE;
            target.add(labelDisableLower, cons);
            cons.gridwidth = GridBagConstraints.REMAINDER;
            target.add(checkDisableLower, cons);
            
            cons.gridwidth = GridBagConstraints.RELATIVE;
            target.add(labelChangeActual, cons);
            cons.gridwidth = GridBagConstraints.REMAINDER;
            target.add(checkChangeActual, cons);
            
            for (int i = 0; i < 5; i++){
            	target.add(new JLabel(" "), cons);
            }
        }
        
        private void initLastPart(JPanel target){
        	buttonOk = new JButton(Languages.get("OK"));
        	buttonOk.addActionListener(new ActionHandler());
        	buttonCancel = new JButton(Languages.get("Cancel"));
        	buttonCancel.addActionListener(new ActionHandler());
        	buttonActualize = new JButton(Languages.get("Adopt"));
        	buttonActualize.addActionListener(new ActionHandler());
        	
            GridBagConstraints cons = new GridBagConstraints();
            cons.gridx = 0;
            cons.gridy = 0;
            cons.weightx = 1.0;
            cons.fill = GridBagConstraints.HORIZONTAL;
            
            target.add(buttonOk, cons);
            cons.gridx++;
            
            target.add(buttonCancel, cons);
            cons.gridx++;
            
            target.add(buttonActualize, cons);
        }
        
        private void initSettings(){
        	
        }
    }
}
```
Wichtig für den Dialog ist die Unterklasse "OptionsDialogPanel", die alle Buttons, etc. verwaltet.

Vorerst geht es mir mehr um das Aussehen. Dazu benutze ich das GridBagLayout. Und bevor jemand fragt, wieso ich extra Labels hab, anstatt bei meinen ComboBoxen den Text direkt einzubauen - wills einfach so und denke, ich kann dann auch besser das Aussehen verwalten (wo steht der Text, wie groß, etc.). Ich versuche aus den Optionen so ne Art Tabelle zu basteln - links Label, rechts die CheckBox / ComboBox. 
Sieht schon gut aus, aber ich will jetzt noch, wie bei einer richtigen Tabelle, die Spalten und Zeilen per hellgrauen Linien trennen. Eine Border für jede Komponente geht auch nicht, ohne dass etwas ungewolltes passiert. Hab einfach mal gegooglet und die JTable gefunden, aber die ist leider nur für Text geeignet, wenn ich es richtig verstanden habe.
Weiß jemand Rat? 

Gruß, Thomas

PS: Bevor viel gesucht wird. Die Gestaltung passiert in der Methode initCenterPanel() von der Unterklasse OptionsDialogPanel (und initLastPart()).


----------



## Gast2 (25. Jul 2011)

Vielleicht wäre das Forms Layout von Karsten Jensch (JGoodies Forms) was für dich. 

Ist genau für solche Sachen ausgelegt und sehr einfach zu verwenden. Bin ich selber vor 2 Wochen drauf gestoßen und das hat genau solche Probleme die du jetzt hast sehr flexibel lösbar gemacht.


----------



## Camino (25. Jul 2011)

beastofchaos hat gesagt.:


> Sieht schon gut aus, aber ich will jetzt noch, wie bei einer richtigen Tabelle, die Spalten und Zeilen per hellgrauen Linien trennen.


Was du im GridBagLayout machen könntest, wäre mit JSeparator Linien zwischen Komponenten zu ziehen. Das geht sowohl vertikal wie auch horizontal. Geht zwar nicht wie bei einer Tabelle mit einem Gitternetz, aber damit kann man Spalten oder Zeilen trennen.


----------



## Gast2 (25. Jul 2011)

Camino hat gesagt.:


> Was du im GridBagLayout machen könntest, wäre mit JSeparator Linien zwischen Komponenten zu ziehen. Das geht sowohl vertikal wie auch horizontal. Geht zwar nicht wie bei einer Tabelle mit einem Gitternetz, aber damit kann man Spalten oder Zeilen trennen.



Hab mal gerade nachgeschaut. Der Standard Builder im Forms Layout macht das genau so. Nur halt gekapselt über die Forms API. Ist jetzt die Frage ob du beim Umstieg auf das Forms Layout zu viel bestehenden GUI COde ändern musst. Solltest du noch die meisten Dialoge vor dir haben lohnt es sich imho durchaus.


----------



## beastofchaos (25. Jul 2011)

Also ich werde warscheinlich für die ganzen Effekte (schwarz-weiß / Helligkeit / etc.) jeweils einen Dialog machen.

Wegen dem Custom-Layout: Könnt ihr mir einen Link zu JGoodies geben? Ich hab nur den gefunden 
- JGoodies :: Java User Interface Design

Da find ich kein geeignetes Beispiel. Da kann man, glaub ich, JGoodies runterladen. Werde mich mal morgen mit dem quellcode bekanntmachen  Es sei denn, es gibt ne Seite mit leichtem Beispielcode + Demo.

Sonst werd ich mir mal die JSeperator anschaun und versuchen damit eine Tabelle selbst zu basteln, egal wie umständlich. Gegebenenfalls würd ich sogar selbst "schnell" ein eigenes Layout basteln, da ich Zeit und Lust habe - schnelle Lösung bevorzuge ich natürlich 

Gruß, Thomas


----------



## beastofchaos (25. Jul 2011)

Ich hab jetzt mal auf der Download-Seite die "Forms Demo" runtergeladen (als Java) und durchgeschaut. Das Layout kann soviel, dass mir das schon Angst macht  Bloß hab ich nichts gefunden, was es mir direkt ermöglicht, eine Tabelle MIT RAND zu basteln - zwar anordnugsmäßig schon, aber die Linien würden halt fehlen - also bleib ich lieber bei der Idee JSeperator und schau mri das morgen an


----------



## Gast2 (26. Jul 2011)

http://www.jgoodies.com/articles/forms.pdf

Auf Seite 8 wird der Form Builder beschrieben. Denke das wäre was du brauchst. Da kann man Seperator generisch in das Layout einsetzen. Extrem einfach!

Das LAyout kann tatsächlich extrem viel, jedoch hat es auch extrem einfach zu nutzende APIs wie z.B. den FormBuilder. 

Wenn man mehr braucht kann man das Layout immer noch straight forward nutzen. 

PS: Wenn du dann noch nen Rahmen drumherum brauchst. Setze auf das Panel welches generiert wird einfach nen Border.


----------



## turtle (26. Jul 2011)

Wenn Du schon den Forms Layout von Karsten Jensch (JGoodies Forms) gefunden hast, ist der Abeille Forms Designer ein weiterer Blick wert. 

Damit kannst Du eine GUI zusammenklicken, in einer Datei speichern und sehr einfach in Deinem Programm anzeigen.


----------



## Gast2 (26. Jul 2011)

turtle hat gesagt.:


> Wenn Du schon den Forms Layout von Karsten Jensch (JGoodies Forms) gefunden hast, ist der Abeille Forms Designer ein weiterer Blick wert.
> 
> Damit kannst Du eine GUI zusammenklicken, in einer Datei speichern und sehr einfach in Deinem Programm anzeigen.



Mit GUI Buildern wäre ich imho sehr vorsichtig. Oft erzeugen die sehr schwer wartbaren Code. Zudem (das weiss ich allerdings nur beim Forms Layout sicher) gibts nicht in allen Layouts die Möglichkeit Auflösungsunabhängige Abstände einzufügen. 

Beim Forms sind das Dialog Units. Keine Pixel. Proportionen bleiben so über verschiedene Auflösungen erhalten.


----------



## turtle (26. Jul 2011)

Ich stimme kappesf zu und bin bei generierten Code auch immer skeptisch, der Abeille Forms Designer  erzeugt aber keinen Java-Code, wenn man dies nicht möchte. Man liest "nur" die von Abeille erzeugte Datei, in der das Layout der GUI steckt, einfach ein und erzeugt sein JPanel.


----------



## Peter W. Marth (26. Jul 2011)

Hallo,

in einer JTable kann man nicht nur Text anzeigen, sondern auch Checkboxen, Listboxen usw.
How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Landei (26. Jul 2011)

Dann lieber gleich TableLayout. MigLayout gibt es auch noch.


----------



## turtle (26. Jul 2011)

Du kannst Deiner JTable eine Border hinzufügen. Also zum Beispiel:

```
Border raisedbevel = BorderFactory.createRaisedBevelBorder();	
Border loweredbevel = BorderFactory.createLoweredBevelBorder();
CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(raisedbevel, loweredbevel);
table.setBorder(compoundBorder);
```


----------



## beastofchaos (26. Jul 2011)

Also ich hab alles durchgelesen und verstanden, aber bevor ich was runterlade, ausprobiere oder so, nehm ich lieber das JTable. Hab die ganze Zeit gehofft, jemand würde das sagen D

Ich suche mir jetzt ein paar Tutorials usw., um zu verstehen, wie JTable funktioneit und wie ich Objekte hinzufüge 

@Turtle: Wozu eine CompoundBorder -> einfach lowered:


```
setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
```


----------



## beastofchaos (26. Jul 2011)

Also ich hab mich jetzt mit dem JTable bekannt gemacht, aber so ganz bekomme ich es nicht hin, dass er Checkboxen oder ComboBoxen anzeigt. bei CheckBoxen würde ein boolean-Wert reichen, da ich aber am ende alles auslese und ich sowieso für ComboBoxen einen Renderer erstellen muss, mach ich das selbe für CheckBoxen.

edit: Anscheinend ist JTable zu unflexibel. Bei meinen Optionen ist die Komponente nicht einheitlich das gleiche - das heißt, ich hab in einer Spalte nicht überall das selbe - mal JCheckBox, mal JComboBox o.ä.

edit2: Also ich benutze jetzt einfach JSeparator - wird sonst viel zu kompliziert   ( will schließlich unterschiedliche große Spalten, mehrere Renderer+Editoren. Wäre mir zu aufwendig und so siehts auch gut aus - s.Anhang) - Thema geclosed. Und DANKE für die vielen Anstöße

Gruß, Thomas


----------



## Gast2 (27. Jul 2011)

beastofchaos hat gesagt.:


> Also ich hab mich jetzt mit dem JTable bekannt gemacht, aber so ganz bekomme ich es nicht hin, dass er Checkboxen oder ComboBoxen anzeigt. bei CheckBoxen würde ein boolean-Wert reichen, da ich aber am ende alles auslese und ich sowieso für ComboBoxen einen Renderer erstellen muss, mach ich das selbe für CheckBoxen.
> 
> edit: Anscheinend ist JTable zu unflexibel. Bei meinen Optionen ist die Komponente nicht einheitlich das gleiche - das heißt, ich hab in einer Spalte nicht überall das selbe - mal JCheckBox, mal JComboBox o.ä.
> 
> ...



Also mir erscheint sehr kompliziet was du da zusammenbastelst. Hast du dir das PDF angeschaut (das Whitepaper ?). Dari nist gezeigt wie man deine Sachen in 10 Minuten in 20 Zeilen Code realisiert.


----------



## beastofchaos (27. Jul 2011)

Abgesehen davon, dass ich für das GridBagLayout die Constraints ein paar mal verändern muss, brauch ich auch ca. 10-20 Zeilen Code  Es sieht ja ganz ok jetzt aus, wenn ich nochmal Lust und Zeit hab, das zu verbessern (mal schaun, wiefern noch), dann bau ich das rein


----------

