# Abstand ZUM BorderLayout



## DeeDee0815 (15. Jul 2007)

Hallo,

ich hoffe der Titel ist aussagekräftig genug  :roll: .

Ich habe ein JDialog-Fenster mit BorderLayout. Dies enhält ein JTabbedPane und einen Schließen-Button. An sich alles kein Problem, allerdings würde ich gerne einen Abstand vom Fentsterinhalt zum Rand definieren. Ich habe auch noch in keinem Programm gesehen, dass dort ein TabbedPane direkt am Fensterrand andockte. Links und Rechts sowie unten soll auch ein entsprechener Abstand sein.

Mit


```
public BorderLayout(int hgap, int vgap)
```

komme ich nicht weiter, weil ich ja so nur den Abstand zwischen den Elementen, in diesem Fall zwischen JTabbedPane und Button festlegen kann. Auch das Layout in ein Null-Layout mit entsprechener Abstandposition zu stecken ist nicht so toll, da ich feststellen musste, das die Fenstergröße den Fensterrahmen einschließt. De Facto kann ich den Abstand rechts und unten nicht genau bestimmen.

Ich hoffe, ich habe mich klar genug ausgedrückt.

MfG
DeeDee0815


----------



## André Uhres (15. Jul 2007)

Versuch's mal mit einem EmptyBorder.


----------



## Guest (15. Jul 2007)

bzw. mit CompoundBorder


----------



## Guest (16. Jul 2007)

Hi,

also bei einem CompoundBorder gerät der Abstand ins minus, also das nützt nichts. Und bei dem Emptyborder kriege ich eine Fehlermeldung. Wie gibt man denn Überhaupt die Border-größe bei einem Emptyborder an?

Ich habe bisher folgendes gemacht:

```
tabbedpane.setBorder(new EmptyBorder(null));
```

Statt null Zahlen anzugeben geht nicht.

MfG
DeeDee0815


```
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

class Settings
extends JDialog
implements ActionListener
{
	private static final long serialVersionUID = 1L;
	
	private JTextField saving2;
	private JTextField saving4;
	private JTextField saving6;
	private JPasswordField saving8;
	
	public Settings()
	{
		final JDialog SettingsFrame = new JDialog(this, "Einstellungen", true);
		SettingsFrame.pack();
		SettingsFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("Settings.png")));
		SettingsFrame.setSize(420, 320);
		SettingsFrame.setResizable(false);
		SettingsFrame.setLocationRelativeTo(null);
		
		JTabbedPane tabbedpane = new JTabbedPane();
		
		JPanel general = new JPanel();
		general.setLayout(null);
		JCheckBox general0 = new JCheckBox("Letzte Sitzung beim starten automatisch laden");
		JCheckB...

[...]

		...e.addTab("Speichern", saving);
		
		JPanel features = new JPanel();
		features.setLayout(null);
		tabbedpane.addTab("Spezialfunktionen", features);
		
		tabbedpane.setBorder(new EmptyBorder(null));
		
		SettingsFrame.add(tabbedpane, BorderLayout.CENTER); // <- siehe HIER!
		
		JButton close = new JButton(new AbstractAction("Schließen") {
			private static final long serialVersionUID = 1L;
			public void actionPerformed(ActionEvent event)
			{
				SettingsFrame.setVisible(false);
				SettingsFrame.dispose();
			}
		});
		SettingsFrame.add(close, BorderLayout.SOUTH);
		
		SettingsFrame.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent event) {
		String command = event.getActionCommand();
		if(command == "In MRF-Dateien speichern") {
			saving2.setEnabled(false);
			saving4.setEnabled(false);
			saving6.setEnabled(false);
			saving8.setEnabled(false);			
		} else if(command == "In MySQL-Datenbank speichern") {
			saving2.setEnabled(true);
			saving4.setEnabled(true);
			saving6.setEnabled(true);
			saving8.setEnabled(true);
		}
	}
}
```


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.border.EmptyBorder.<init>(EmptyBorder.java:54)
	at Settings.<init>(Settings.java:126)
	at MainMenu$18.actionPerformed(MainMenu.java:204)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1170)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1211)
	at java.awt.Component.processMouseEvent(Component.java:6038)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
	at java.awt.Component.processEvent(Component.java:5803)
	at java.awt.Container.processEvent(Container.java:2058)
	at java.awt.Component.dispatchEventImpl(Component.java:4410)
	at java.awt.Container.dispatchEventImpl(Container.java:2116)
	at java.awt.Component.dispatchEvent(Component.java:4240)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
	at java.awt.Container.dispatchEventImpl(Container.java:2102)
	at java.awt.Window.dispatchEventImpl(Window.java:2429)
	at java.awt.Component.dispatchEvent(Component.java:4240)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
```


----------



## André Uhres (16. Jul 2007)

tabbedpane.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));


----------



## DeeDee0815 (17. Jul 2007)

Achso. Na dann vielen Dank für die Hilfe. So funktionierts wie ich es möchte.

MfG
DeeDee0815


----------



## DeeDee0815 (17. Jul 2007)

Leider entsteht bei dieser Variante ein hässlicher Dartstellungsfehler. Gibt es eine Möglichkeit, dem entgegenzuwirken?







MfG
DeeDee0815


----------



## André Uhres (17. Jul 2007)

DeeDee0815 hat gesagt.:
			
		

> Leider entsteht bei dieser Variante ein hässlicher Dartstellungsfehler..


Bei mir Gott sei Dank nicht  
Und ohne setBorder ist es schön?
Du kannst auch den Tabbedpane in ein Panel mit BorderLayout tun und
den setBorder dann auf dem JPanel machen, statt auf dem Tabbedpane :wink:


----------



## DeeDee0815 (19. Jul 2007)

Das ist eine gute Idee.

Wenn ich das aber mache, sieht das alles etwas komisch aus:






Was ist denn hier falsch?!


```
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

class Settings
extends JDialog
implements ActionListener
{
	private static final long serialVersionUID = 1L;
	
	private JTextField saving2;
	private JTextField saving4;
	private JTextField saving6;
	private JPasswordField saving8;
	
	public Settings()
	{
		final JDialog SettingsFrame = new JDialog(this, "Einstellungen", true);
		SettingsFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("Settings.png")));
		SettingsFrame.setSize(440, 340);
		SettingsFrame.setResizable(false);
		SettingsFrame.setLocationRelativeTo(null);
		
		JPanel panel = new JPanel();
		
		JTabbedPane tabbedpane = new JTabbedPane();
		
// blablabla Panels für das JTabbedPane

		//tabbedpane.setBorder(BorderFactory.createEmptyBorder(10, 10, 5, 10));
		
		panel.add(tabbedpane, BorderLayout.CENTER);
		
		JButton close = new JButton(new AbstractAction("Schließen") {
			private static final long serialVersionUID = 1L;
			public void actionPerformed(ActionEvent event)
			{
				SettingsFrame.setVisible(false);
				SettingsFrame.dispose();
			}
		});
		panel.add(close, BorderLayout.SOUTH);
		
		SettingsFrame.add(panel, BorderLayout.CENTER);
		SettingsFrame.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent event) {
		String command = event.getActionCommand();
		if(command == "In MRF-Dateien speichern") {
			saving2.setEnabled(false);
			saving4.setEnabled(false);
			saving6.setEnabled(false);
			saving8.setEnabled(false);			
		} else if(command == "In MySQL-Datenbank speichern") {
			saving2.setEnabled(true);
			saving4.setEnabled(true);
			saving6.setEnabled(true);
			saving8.setEnabled(true);
		}
	}
}
```


MfG
DeeDee0815


----------



## André Uhres (19. Jul 2007)

```
JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 5, 10));
```


----------



## DeeDee0815 (19. Jul 2007)

Achso: Ich dachte man könnte wie bei den JFrames das Layout indirekt mit add() angeben. Also Vielen Dank, jetzt läufts so, wie ich es will: Es ist übrigens auch kein Zufall, dass ich den Button und das TabbedPane in das Panel gesteckt habe. Nicht das Du an einen Verständnisfehler meinerseids glaubst.   

Also Vielen Dank!






MfG
DeeDee0815


----------



## André Uhres (19. Jul 2007)

DeeDee0815 hat gesagt.:
			
		

> Achso: Ich dachte man könnte wie bei den JFrames das Layout indirekt mit add() angeben..


Im add gibt man nicht das Layout an, sondern die Constraints. Weil JFrame als Default den BorderLayout hat,
kann man auch die Constraints vom BorderLayout verwenden. JPanel hat aber als Default den FlowLayout.
Deshalb muss man ihm explizit den BorderLayout setzen, um ihn auch dort verwenden zu können :wink:


----------



## DeeDee0815 (19. Jul 2007)

Achso, okay. Danke für die Info.

MfG
DeeDee0815


----------



## Java-User (11. Dez 2007)

Vielen Dank für diesen Befehl BorderFactory.createEmptyBorder...
danach habe ich gesucht


----------

