GridBagLayout - petla

0

Witam
Chciałbym stworzyć małą gierkę turową która odbywałaby się na planszy 10x10
Planuje zastosować do tego GridBagLayout ale niestety mam problem, ponieważ chciałbym aby przyciski były tworzone w pętli ale niestety
program kompiluje sie ale nie odpala....
Wrzucam przykład dla planszy 3x3 :

 private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0};
		gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		frame.getContentPane().setLayout(gridBagLayout);
		
		JLabel lblKamil = new JLabel("Kamil");
		GridBagConstraints gbc_lblKamil = new GridBagConstraints();
		gbc_lblKamil.insets = new Insets(0, 0, 5, 5);
		gbc_lblKamil.gridx = 3;
		gbc_lblKamil.gridy = 0;
		frame.getContentPane().add(lblKamil, gbc_lblKamil);
		
		
		JButton btnField [][] = null;
		GridBagConstraints gbcBtnField [][] = null;
		for(int i = 1 ; i<=3;i++){
			for(int j = 1 ; j<=3 ; j++){
				btnField[i][j] = new JButton("Button");
				gbcBtnField[i][j] = new GridBagConstraints();
				gbcBtnField[i][j].gridx = i;
				gbcBtnField[i][j].gridy = j;
				frame.getContentPane().add(btnField[i][j],gbcBtnField[i][j]);
				
			}
			
		}

A moje drugie pytanie w jaki sposob mogę ustalić wielkość tych buttonów ? xd ponieważ setSize nie działa :/

1
  1. Nie stworzyłeś tablicy buttonów, tylko ją zadeklarowałeś.
  2. Spróbuj metody setPreferredSize/setMinimumSize/setMaximumSize
0
  1. Dzięki zadziałało :) Wrzucam kod dla potomnych
 
JButton  [][]btnField = new JButton[3][3];
		GridBagConstraints gbcBtnField [][] = new GridBagConstraints[3][3];
		for(int i = 0 ; i<3;i++){
			for(int j = 0 ; j<3 ; j++){
				btnField[i][j] = new JButton("Button" +i+j);
				gbcBtnField[i][j] = new GridBagConstraints();
				gbcBtnField[i][j].gridx = i;
				gbcBtnField[i][j].gridy = j+1;
				frame.getContentPane().add(btnField[i][j],gbcBtnField[i][j]);
				
			}
			

Zadziałało setPrefferSize :) Ale tu mam kolejne pytanko mianowicie. Dodałem jeszcze "pack" do Frame by mi ustawiał odpowiednio wielkie okno. Ale jest problem gdy zaczynam zwiększać Frame. Kontrolki wtedy "wariuja", zwiekszaja swoje odleglosci itd. Wrzucam screena w zalaczniku

private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0};
		gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		frame.getContentPane().setLayout(gridBagLayout);
		Dimension sizeFrame = new Dimension(100,300);
		//frame.setPreferredSize(sizeFrame);
		JLabel lblKamil = new JLabel("Kamil");
		GridBagConstraints gbc_lblKamil = new GridBagConstraints();
		gbc_lblKamil.insets = new Insets(0, 0, 5, 5);
		gbc_lblKamil.gridx = 3;
		gbc_lblKamil.gridy = 0;
		
		frame.getContentPane().add(lblKamil, gbc_lblKamil);
		
		
		JButton  [][]btnField = new JButton[10][10];
		GridBagConstraints gbcBtnField [][] = new GridBagConstraints[10][10];
		for(int i = 0 ; i<10;i++){
			for(int j = 0 ; j<10 ; j++){
				btnField[i][j] = new JButton("Button" +i+j);
				Dimension preferredSize = new Dimension(50,50);
				btnField[i][j].setPreferredSize(preferredSize);
				gbcBtnField[i][j] = new GridBagConstraints();
				gbcBtnField[i][j].gridx = i;
				gbcBtnField[i][j].gridy = j+1;
				frame.getContentPane().add(btnField[i][j],gbcBtnField[i][j]);
				frame.pack();
			}
			
		}
	
	} 
0

To może zabroń zabaw z rozmiarem okna.

frame.serResizable(false);
0

ustaw layout w ten sposób

frame.setLayout(new GridBagLayout());

Nie ustawiaj mu bezsensownych wartości

gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0};
gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0};
gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
0

No właśnie chodziło oto by użytkownik mógł zmienić rozmiar (takie wytyczne od wykladowcy).
Garai Masz racje wystarczyło usunięcie tych czterech linijek.
A przy okazji, jaka zatem jest różnica między

frame.setLayout(new GridBagLayout()); 

a

frame.getContentPane().setLayout(gridBagLayout); 

bo działanie mają takie same a spotkałem się z oboma zapisami

0

@bogdans wspominał, że nie ma różnicy dla javy większej niż 1.4.
Ja to zapisałem w ten sposób, ponieważ nie potrzebna już Ci była zmienna gridBagLayout

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