Layout Manager (menager rozmieszczenia)

0

W jednym oknie, chciałbym rozmieścić trzy różne panele. Używając GridLayout, tak jak w poniższym kodzie, otrzymuje bardzo sztuczny efekt - każdy z trzech paneli ma taką samą wielkość, a poza tym są rozmieszczone jeden obok drugiego.

Efekt, który chciałbym osiągnąć to dwa panele obok siebie, a pod nimi trzeci panel o szerokości dwukrotnie większej (innymi słowy panel trzeci ma być dwa razy szerszy od panelu pierwszego i drugiego.

Próbowałem to rozwiązać używając setBounds() w konstruktorach i ręcznie ustawić parametry, ale na nic się to zdało. Nie działa.

W takim razie jak należy manipulować ustawieniem paneli.

package my;
import javax.swing.*;
import java.awt.*;


public class Main {
	
	public static void main(String args[]) {
		new Okno();
	}
	
}

class Okno extends JFrame {
	
	PanelPierwszy p1;
	PanelDrugi p2;
	PanelTrzeci p3;
	
	public Okno() {
		
		setLayout(new GridLayout( 1, 2, 3, 4 ));
		
		setResizable(false);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setBounds( 300, 200, 600, 500 );
		
		p1 = new PanelPierwszy();
		p2 = new PanelDrugi();
		p3 = new PanelTrzeci();
	    
		
		getContentPane().add(p1);
		getContentPane().add(p2);
		getContentPane().add(p3);
		
		setVisible(true);
		
	}
	
	class PanelPierwszy extends JPanel {
		
		PanelPierwszy() {
			setBounds( 0, 0, 300, 250 );
			setBackground(Color.darkGray);
		}
		
	}
	
	class PanelDrugi extends JPanel {

		PanelDrugi() {
			setBounds( 300, 0, 300, 250 );
			setBackground(Color.lightGray);
		}
		
	}
	
	class PanelTrzeci extends JPanel {
		
		PanelTrzeci() {
			setBounds( 0, 300, 600, 250 );
			setBackground(Color.magenta);
		}
		
	}
	
	
}


</url>
0

To świetny przykład jak nie warto układać kodu ręcznie.
Działający kod o właściwościach dokładnie takich jakie opisałeś wygenerowałem w 20 sekund przy pomocy Netbeans. Być może te same właściwości da się osiągnąć prostszym layoutManagerem, ale skoro do dyspozycji jest automat, to po co?

Przykładzik poniżej ma ustawione ramki na panelach, żeby było widać ich rozmiary. Można je sobie w rzeczywistym kodzie usunąć.

import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JPanel;
import javax.swing.LayoutStyle.ComponentPlacement;

public class NewJPanel extends JPanel
{
	/** Creates new form NewJPanel */
	public NewJPanel()
	{
		initComponents();
	}

	/** This method is called from within the constructor to
	 * initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is
	 * always regenerated by the Form Editor.
	 */
	@SuppressWarnings("unchecked")
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents()
	{

		jPanel1 = new JPanel();
		jPanel2 = new JPanel();
		jPanel3 = new JPanel();

		setName("Form"); // NOI18N

		jPanel1.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		jPanel1.setName("jPanel1"); // NOI18N

		GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
		jPanel1.setLayout(jPanel1Layout);
		jPanel1Layout.setHorizontalGroup(
			jPanel1Layout.createParallelGroup(Alignment.LEADING).addGap(0, 185,
			Short.MAX_VALUE));
		jPanel1Layout.setVerticalGroup(
			jPanel1Layout.createParallelGroup(Alignment.LEADING).addGap(0, 134,
			Short.MAX_VALUE));

		jPanel2.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		jPanel2.setName("jPanel2"); // NOI18N

		GroupLayout jPanel2Layout = new GroupLayout(jPanel2);
		jPanel2.setLayout(jPanel2Layout);
		jPanel2Layout.setHorizontalGroup(
			jPanel2Layout.createParallelGroup(Alignment.LEADING).addGap(0, 185,
			Short.MAX_VALUE));
		jPanel2Layout.setVerticalGroup(
			jPanel2Layout.createParallelGroup(Alignment.LEADING).addGap(0, 134,
			Short.MAX_VALUE));

		jPanel3.setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0)));
		jPanel3.setName("jPanel3"); // NOI18N

		GroupLayout jPanel3Layout = new GroupLayout(jPanel3);
		jPanel3.setLayout(jPanel3Layout);
		jPanel3Layout.setHorizontalGroup(
			jPanel3Layout.createParallelGroup(Alignment.LEADING).addGap(0, 378,
			Short.MAX_VALUE));
		jPanel3Layout.setVerticalGroup(
			jPanel3Layout.createParallelGroup(Alignment.LEADING).addGap(0, 134,
			Short.MAX_VALUE));

		GroupLayout layout = new GroupLayout(this);
		this.setLayout(layout);
		layout.setHorizontalGroup(
			layout.createParallelGroup(Alignment.LEADING).addGroup(
			Alignment.TRAILING, layout.createSequentialGroup().addContainerGap().
			addGroup(
			layout.createParallelGroup(Alignment.TRAILING).addComponent(jPanel3,
			GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).
			addGroup(Alignment.LEADING, layout.createSequentialGroup().
			addComponent(jPanel1, GroupLayout.DEFAULT_SIZE,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addPreferredGap(
			ComponentPlacement.RELATED).addComponent(jPanel2,
			GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))).
			addContainerGap()));
		layout.setVerticalGroup(
			layout.createParallelGroup(Alignment.LEADING).addGroup(layout.
			createSequentialGroup().addContainerGap().addGroup(layout.
			createParallelGroup(Alignment.LEADING).addComponent(jPanel2,
			GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).
			addComponent(jPanel1, GroupLayout.DEFAULT_SIZE,
			GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addPreferredGap(
			ComponentPlacement.RELATED).addComponent(jPanel3,
			GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).
			addContainerGap()));
	}// </editor-fold>
	// Variables declaration - do not modify
	private JPanel jPanel1;
	private JPanel jPanel2;
	private JPanel jPanel3;
	// End of variables declaration
}
0

polecam FormLayout z jgoodies, obejdzie się bez miliona kompletnie nieczytelnych linii automatu

0

Stworzyłem parę formularzy za pomocą graficznych designerów. Za każdym razem czułem wstyd za przyczynienie się do pojawienia się na świecie tak zagmatwanego kodu.
Żądany rozkład można uzyskać tworząc dodatkowy panel pomocniczy.

  • pierwsze rozwiązanie: całość ma GridLayout z 2 wierszami i 1 kolumną, u góry umieszczasz panel pomocniczy, ma on GridLayout z 1 wierszem i 2 kolumnami
  • drugie rozwiązanie: całość i panel pomocniczy mają Border Layout, pomocniczy umieszczasz w centrum, lewy i prawy napomocniczym (west i center || west i east || center i east), dodatkowa zaleta: w głównym panelu masz wolny north i mozesz tam umieścić JToolBara

1 użytkowników online, w tym zalogowanych: 0, gości: 1