Resizeverhalten BorderLayout

Status
Nicht offen für weitere Antworten.

daubor

Mitglied
Hallo,

bin neu im Forum und alle meine Fragen konnten bisher über Google und Co beantwortet werden.
Aber das folgende ist mir ein Rätsel. ???:L

Ich habe ein JPanel mit BorderLayout. Im CENTER sitzt eine JScrollPane. Im SOUTH liegt ein weiteres JPanel.

Nun besitzt mein BorderLayout-Panel eine ComponentTitledBorder (die Klasse hab ich irgendwo im Netz gefunden, sollte relativ leicht zu finden sein). Diese überschreibt jedenfalls die paintBorder() Methode und ruft darin SwingUtilities.paintComponent() auf, um eine beliebig übergebene LigthweightComponent auf die Border zu zeichnen.
Bei mir ist das eine JCheckBox.

Soweit so gut...beim verkleinern des JFrames schiebt sich nun allerdings die JScrollPane, welche im CENTER liegt, unter das JPanel welches im SOUTH liegt. Also der ScrollPane wird nicht bescheid gesagt, dass sich der CENTER Bereich verkleinert...;(
Sieht scheise aus!

Kommentiere ich in der ComponentTitledBorder das SwingUtilities.paintComponent() aus, funktioniert wieder alles :(, aber die JCheckBox wird nicht mehr gezeichnet :autsch:

Jemand ne Idee?!
 

daubor

Mitglied
Hm..keiner ne Idee?! :(
Hab mal ne "Probier"-Klasse rangehangen! Einmal wird mit und einmal ohne die ComponentTitledBorder der Frame geöffnet!
In der ComponentTitledBorder-Klasse sieht man auch das böse SwingUtilities.paintComponent() :mad:
Wenn ihr das ganze startet und die beiden Frames verkleinert, werdet ihr sehen, dass der Resize mit der Border kaputt ist!

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

/*
 * Created on 02.10.2009
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

public class Probier
{

	public void buildGuiWithoutCOmponentTitledBorder()
	{
		JFrame frame = new JFrame();
		Dimension dim = frame.getToolkit().getScreenSize(); 
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		frame.setLocation((dim.width - frame.getWidth()) / 2, (dim.height - frame.getHeight()) / 2); 
		frame.setTitle("Without");

		JPanel mMainPanel = (JPanel) frame.getContentPane();

		JPanel border1 = new JPanel();
		JList list = new JList();
		DefaultListModel lmodel = new DefaultListModel();
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		list.setLayoutOrientation(JList.VERTICAL);

		for (int i = 0; i < 100; i++)
			lmodel.addElement(i);

		list.setModel(lmodel);

		//set Layouts
		border1.setLayout(new BorderLayout());

		//build panels
		border1.setBorder(BorderFactory.createTitledBorder("border1"));
		border1.add(new JLabel("border1_south"), BorderLayout.SOUTH);
		border1.add(new JScrollPane(list), BorderLayout.CENTER);

		mMainPanel.add(border1, BorderLayout.CENTER);

		frame.pack();
		frame.setVisible(true); 
	}

	public void buildGuiWithCOmponentTitledBorder()
	{
		JFrame frame = new JFrame();
		Dimension dim = frame.getToolkit().getScreenSize(); 
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		frame.setLocation((dim.width - frame.getWidth()) / 2, (dim.height - frame.getHeight()) / 2); 
		frame.setTitle("With");

		JPanel mMainPanel = (JPanel) frame.getContentPane();

		JPanel border1 = new JPanel();
		JList list = new JList();
		DefaultListModel lmodel = new DefaultListModel();
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		list.setLayoutOrientation(JList.VERTICAL);

		for (int i = 0; i < 100; i++)
			lmodel.addElement(i);

		list.setModel(lmodel);

		//set Layouts
		border1.setLayout(new BorderLayout());

		//build panels
		border1.setBorder(new ComponentTitledBorder(new JCheckBox(), border1, BorderFactory.createTitledBorder("border1"),
				ComponentTitledBorder.RIGHT));
		border1.add(new JLabel("border1_south"), BorderLayout.SOUTH);
		border1.add(new JScrollPane(list), BorderLayout.CENTER);

		mMainPanel.add(border1, BorderLayout.CENTER);

		frame.pack();
		frame.setVisible(true); 
}

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Probier p = new Probier();

		p.buildGuiWithCOmponentTitledBorder();
		p.buildGuiWithoutCOmponentTitledBorder();

	}

	public class ComponentTitledBorder implements Border, MouseListener, SwingConstants
	{
		int offset = 5;
		int justification = -1;

		public static final int LEFT = 0;
		public static final int RIGHT = 1;

		Component comp;
		JComponent container;
		Rectangle rect;
		Border border;

		public ComponentTitledBorder(Component comp, JComponent container, Border border, int justification)
		{
			this.comp = comp;
			this.container = container;
			this.border = border;
			this.justification = justification;
			container.addMouseListener(this);
		}

		public ComponentTitledBorder(Component comp, JComponent container, Border border)
		{
			this.comp = comp;
			this.container = container;
			this.border = border;
			container.addMouseListener(this);
		}

		public boolean isBorderOpaque()
		{
			return true;
		}

		public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
		{
			Insets borderInsets = border.getBorderInsets(c);
			Insets insets = getBorderInsets(c);
			int temp = (insets.top - borderInsets.top) / 2;
			border.paintBorder(c, g, x, y + temp, width, height - temp);
			Dimension size = comp.getPreferredSize();

			//right alligned
			if (justification > 0)
				offset = width - 5 - size.width;

			rect = new Rectangle(offset, 0, size.width, size.height);

			SwingUtilities.paintComponent(g, comp, (Container) c, rect);
		}

		public Insets getBorderInsets(Component c)
		{
			Dimension size = comp.getPreferredSize();
			Insets insets = border.getBorderInsets(c);
			insets.top = Math.max(insets.top, size.height);
			return insets;
		}

		private void dispatchEvent(MouseEvent me)
		{
			if (rect != null && rect.contains(me.getX(), me.getY()))
			{
				Point pt = me.getPoint();
				pt.translate(-offset, 0);
				comp.setBounds(rect);
				comp.dispatchEvent(new MouseEvent(comp, me.getID(), me.getWhen(), me.getModifiers(), pt.x, pt.y, me
						.getClickCount(), me.isPopupTrigger(), me.getButton()));
				if (!comp.isValid())
				{
					container.repaint();
				}
			}
		}

		public void mouseClicked(MouseEvent me)
		{
			dispatchEvent(me);
		}

		public void mouseEntered(MouseEvent me)
		{
			dispatchEvent(me);
		}

		public void mouseExited(MouseEvent me)
		{
			dispatchEvent(me);
		}

		public void mousePressed(MouseEvent me)
		{
			dispatchEvent(me);
		}

		public void mouseReleased(MouseEvent me)
		{
			dispatchEvent(me);
		}

	}

}
 

Marco13

Top Contributor
So eine "Probier"-Klasse (auch bekannt als KSKB) erhöht die Wahrscheinlichkeit eine Antwort zu erhalten fast immer.

Auch in diesem Fall.

Der Grund für das fehlerhafte Verhalten ist die SwingUtilities.paintComponent-Methode. Die nervt mich tierisch :mad: eigentlich soll sie nur ein Component zeichnen, aber sie macht noch allen möglichen anderen Scheiß ... die Bounds der gezeichneten Component ändern, und neue Components (CellRenderPane) zum Container hinzufügen...

In diesem Fall scheint es zu helfen, wenn man das, was die Methode macht, "per Hand" durchführt, und keine CellRenderPane erstellt... Die paintBorder-Methode würde dann so aussehen
Java:
        public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
        {
            Insets borderInsets = border.getBorderInsets(c);
            Insets insets = getBorderInsets(c);
            int temp = (insets.top - borderInsets.top) / 2;
            border.paintBorder(c, g, x, y + temp, width, height - temp);
            Dimension size = comp.getPreferredSize();

            //right alligned
            if (justification > 0)
                offset = width - 5 - size.width;

            rect = new Rectangle(offset, 0, size.width, size.height);
            comp.setBounds(rect);
            g.translate(offset,0);
            comp.paint(g);
            g.translate(-offset,0);
        }
Ist nur kurz getestet, aber scheint erstma zu gehen...
 

daubor

Mitglied
Des geht :toll:

Danke für die super Erklärung, was die paintComponent() da im Hintergrund alles treibt!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
L BorderLayout in BorderLayout verknüpfen AWT, Swing, JavaFX & SWT 2
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
F BorderLayout Hilfe bei Anzeige AWT, Swing, JavaFX & SWT 2
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
C Swing Borderlayout im JFrame AWT, Swing, JavaFX & SWT 4
C Swing Geschachteltes GUI mit BorderLayout - Vertikal & horizontal Verschieben AWT, Swing, JavaFX & SWT 1
P AWT BorderLayout AWT, Swing, JavaFX & SWT 2
A BorderLayout "Center" Inhalt wechseln AWT, Swing, JavaFX & SWT 1
S Swing [CLOSED] NullPointerException bei BorderLayout() AWT, Swing, JavaFX & SWT 8
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
B Swing Borderlayout East über North AWT, Swing, JavaFX & SWT 5
Q JFrame/BorderLayout AWT, Swing, JavaFX & SWT 3
A LayoutManager Höhe von NORTH beim BorderLayout ändern AWT, Swing, JavaFX & SWT 4
bluerob Panel im BorderLayout South wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
M BorderLayout JPanel liegt nicht richtig an AWT, Swing, JavaFX & SWT 12
R BorderLayout AWT, Swing, JavaFX & SWT 4
C LayoutManager BorderLayout im richtigen Format beschriften AWT, Swing, JavaFX & SWT 10
C CardLayout in BorderLayout? AWT, Swing, JavaFX & SWT 36
S Problem mit BorderLayout NORTH und SOUTH AWT, Swing, JavaFX & SWT 2
T Borderlayout Ecken AWT, Swing, JavaFX & SWT 2
H Swing JInternalFrame, JDesktopPane und ein BorderLayout AWT, Swing, JavaFX & SWT 2
R Problem mit Box bzw BorderLayout AWT, Swing, JavaFX & SWT 6
G LayoutManager BorderLayout WEST Bereich auf maximale Größe beschränken AWT, Swing, JavaFX & SWT 19
P LayoutManager BorderLayout - Zweimal Norden ? AWT, Swing, JavaFX & SWT 4
E LayoutManager GridBagLayout in BorderLayout - Abstand bei Resizing AWT, Swing, JavaFX & SWT 2
R BorderLayout: EAST, CENTER, WEST AWT, Swing, JavaFX & SWT 5
2 AWT Borderlayout: Grafikelemente ein und ausblenden AWT, Swing, JavaFX & SWT 2
J LayoutManager BorderLayout - 2 Buttons in SOUTH nebeneinander platzieren? AWT, Swing, JavaFX & SWT 3
N JPanel vertikal im BorderLayout zentrieren AWT, Swing, JavaFX & SWT 2
S Anordnen von Buttons im BorderLayout AWT, Swing, JavaFX & SWT 6
F Im BorderLayout eine feste Grösse zuweisen! AWT, Swing, JavaFX & SWT 9
S JSplitpane in BorderLayout nutzen AWT, Swing, JavaFX & SWT 4
K LayoutManager Borderlayout - NORTH aktualisieren AWT, Swing, JavaFX & SWT 10
B Swing BorderLayout und JPanel AWT, Swing, JavaFX & SWT 3
A GUI Komponenten in Borderlayout zeichnen AWT, Swing, JavaFX & SWT 3
B BorderLayout AWT, Swing, JavaFX & SWT 8
S Swing BorderLayout + Backgroundcolor AWT, Swing, JavaFX & SWT 3
0din Austausch von JPanel in BorderLayout AWT, Swing, JavaFX & SWT 3
X Instanzieren und Zuweisen vom BorderLayout an Container nicht notwendig ? AWT, Swing, JavaFX & SWT 4
E AWT Formatierung in BorderLayout AWT, Swing, JavaFX & SWT 10
calzone Swing und BorderLayout AWT, Swing, JavaFX & SWT 11
Strahlungsleck Problem mit dem Anzeigen von Elementen im BorderLayout AWT, Swing, JavaFX & SWT 6
R LayoutManager ähnlich BorderLayout, mit einer Ausnahme AWT, Swing, JavaFX & SWT 2
D BorderLayout.Center mit 3 Panel und dynamischer Größe AWT, Swing, JavaFX & SWT 2
P Probleme bei BorderLayout im JPanel AWT, Swing, JavaFX & SWT 7
G Komponente oben positionieren (BorderLayout) AWT, Swing, JavaFX & SWT 3
G BorderLayout - zentrieren AWT, Swing, JavaFX & SWT 1
S [BorderLayout]WEST/EAST sollen über ganze Höhe gehen; AWT, Swing, JavaFX & SWT 3
A BorderLayout Verhältnis festlegen? AWT, Swing, JavaFX & SWT 5
F Farbe für den Hintergrund eine BorderLayout-Teils AWT, Swing, JavaFX & SWT 5
O Probleme bei BorderLayout AWT, Swing, JavaFX & SWT 5
H Bei BorderLayout SOUTH minimieren AWT, Swing, JavaFX & SWT 3
DeeDee0815 Abstand ZUM BorderLayout AWT, Swing, JavaFX & SWT 13
K BorderLayout--> feste Größe AWT, Swing, JavaFX & SWT 2
D BorderLayout + Buttongröße ändern AWT, Swing, JavaFX & SWT 4
P JPanel im BorderLayout feste Größe/Position zuordnen AWT, Swing, JavaFX & SWT 3
L Alle Inhalte in BorderLayout.CENTER löschen? AWT, Swing, JavaFX & SWT 2
M Layout Problem (GrudBag- + BorderLayout) AWT, Swing, JavaFX & SWT 6
O GridBag IN BorderLayout? AWT, Swing, JavaFX & SWT 5
J BorderLayout / 1 Panel in Mitte und 1 Panel im Osten anordne AWT, Swing, JavaFX & SWT 6
F FlowLayout in BorderLayout AWT, Swing, JavaFX & SWT 4
D BorderLayout mit JTextField AWT, Swing, JavaFX & SWT 7
B BorderLayout.WEST (JTree strecken in Höhe) AWT, Swing, JavaFX & SWT 2
B BorderLayout/JSplitPane Problem beim Ausrichten AWT, Swing, JavaFX & SWT 5
F Anordnung im BorderLayout AWT, Swing, JavaFX & SWT 6
S Toolbar in einem BorderLayout verschieben AWT, Swing, JavaFX & SWT 4
M FlowLayout in BorderLayout einbinden? AWT, Swing, JavaFX & SWT 6
J Ermittlung der Ausrichtung einer Komponente im BorderLayout AWT, Swing, JavaFX & SWT 3
M AWT borderLayout AWT, Swing, JavaFX & SWT 7
R dummes BorderLayout :( AWT, Swing, JavaFX & SWT 8
H BorderLayout.setBackground AWT, Swing, JavaFX & SWT 2
J paint(Graphics g) im BorderLayout einem JPanel zuordnen &amp AWT, Swing, JavaFX & SWT 19
C Borderlayout und Checkboxgruppen AWT, Swing, JavaFX & SWT 3
frau-u Borderlayout - zusätzliche Zeile AWT, Swing, JavaFX & SWT 4
W Probleme mit BorderLayout AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben