GridBagLayout - petla

GridBagLayout - petla
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
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 :

Kopiuj
 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 :/

GA
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 5 lat
1
  1. Nie stworzyłeś tablicy buttonów, tylko ją zadeklarowałeś.
  2. Spróbuj metody setPreferredSize/setMinimumSize/setMaximumSize
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
0
  1. Dzięki zadziałało :) Wrzucam kod dla potomnych
Kopiuj
 
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

Kopiuj
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();
			}
			
		}
	
	} 
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

To może zabroń zabaw z rozmiarem okna.

Kopiuj
frame.serResizable(false);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
GA
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 5 lat
0

ustaw layout w ten sposób

Kopiuj
frame.setLayout(new GridBagLayout());

Nie ustawiaj mu bezsensownych wartości

Kopiuj
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};
I2
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:229
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

Kopiuj
frame.setLayout(new GridBagLayout()); 

a

Kopiuj
frame.getContentPane().setLayout(gridBagLayout); 

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

edytowany 1x, ostatnio: bogdans
GA
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 5 lat
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.