GridBagLayout -uklad arkuszowy, kod:

0

Witam mam taki programik(testowy) i probuje go poustawiac zgodnie z GridBagLayout:/ ale nic nie wychodzi pojawia sie puste okienko:/
jesli dam tak: panel.setLayout(uklad); i tak: panel.add(pisz, wytyczna); wywali mi na samym srodku napis a jak tak jak w kodzie to wlasnie w ogóle:/

import javax.swing.*;
import java.util.*;
import java.io.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.event.*;
public class uklad extends JFrame implements ActionListener
{
	ImageIcon ikona=new ImageIcon("save.gif");
	JButton zapisz=new JButton(ikona);
	JTextField podaj=new JTextField(20);
	JTextArea wypisz=new JTextArea(6,30);
	ArrayList dane=new ArrayList();//pojemnik arraylist na dane
	String s,a;
	public uklad()
	{	
		setSize(370,210);
		setTitle("moj programik:)");
		JPanel panel=new JPanel();
		GridBagLayout uklad=new GridBagLayout(); // uklad arkuszowy
		setLayout(uklad);
		GridBagConstraints wytyczna=new GridBagConstraints();//obiekt okreslajacy
															 // ulozenie wewnwatrz arkusza
		wytyczna.weightx=0;
		wytyczna.weighty=0;
		wytyczna.gridx=0; // 1 // kolumna i rzad gdzie znajduje sie lewy gorny
		wytyczna.gridy=0; // 1 // naroznik komponetu
		wytyczna.gridwidth=1; // 2 // ile rzedow kolumn zajmuje komponent
		wytyczna.gridheight=1; // 2 // 
		wytyczna.fill=GridBagConstraints.NONE;
		wytyczna.anchor=GridBagConstraints.EAST;
		
		wypisz.setEditable(false); 
		wypisz.setLineWrap(true);
		zapisz.addActionListener(this);
		JLabel pisz=new JLabel("teskt:");
		add(pisz, wytyczna);
	
		
	/*	panel.add(wypisz);
		panel.add(pisz);
		panel.add(podaj);
		panel.add(zapisz);*/
				
		setContentPane(panel);
	}
	public void actionPerformed(ActionEvent zdarzenie)
	{
		// 1 //String info="";
		Object klik=zdarzenie.getSource();
		if(klik==zapisz)
		{
			// 1 //info=new String(podaj.getText());
			
			s=podaj.getText();// 2 //
			dane.add(s);
			for(int i=0;i<dane.size();i++)
			{
				a=(String)dane.get(i);
			}
		}
		wypisz.setText(a);
		// 1 //wypisz.setText(info);
//		wypisz.setText(s);// 2 //
		podaj.setText("");
		repaint();
	
	}
	
	public static void main(String argv[])
	{
		uklad okienko=new uklad();
		okienko.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		okienko.setVisible(true);
		
	}
	
}
0

Witam!

Parafrazujac Bruce'a Eckela w jego książce "Thinking in Java":

GridBagLayout jest glownie dla graficznych edytorow gui, bo jest bardzo trudny do zrozumienia. Zamiast niego mozna uzywac BoxLayout.
I to polecam ci wyprobowac. A tak poza tym moze sprobuj uzycia jakiegos IDE z wbudowanym edytorem graficznym.

0

troche stary wątek ale nie rozwiązany...
przede wszystkim GridBagLayout jest chyba najlepszym managerem ze wszystkich ale za to jakimś topornym w skumaniu... (zresztą dalej go nie kumam ot tak) najlepiej jest wyświetlać jeden element i się "bawić" z jego umiejscowieniem na formie, dopiero polecam dołożenie drugiego elem. i tak dalej... to ułatwia zrozumienie GridBag'a

zamieszczam istotny wycinek z własnej aplikacji, namordowałem się z tymi paroma linijkami jakieś pare godzin ale warto było, w efekcie działa to tak, że w oknie znajdują się 2 elem. pierwszy (scrollpane zawierający JTable) jest u góry i się rozszerza wraz ze zwiększaniem rozmiarów okna a drugi (panel) jest po środku na dole i jego rozmiar jest stały (tak zamierzałem) bez względu na wielkość okna

		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints gc = new GridBagConstraints();
		this.setLayout(gridbag);
//wykorzystaj całe dostępne miejsce na 'scrollpane'
		gc.fill = GridBagConstraints.BOTH;//rozszerzaj w obie strony
		gc.gridwidth = GridBagConstraints.REMAINDER;
		gc.weighty = 1;//take vertical free space
		gc.weightx = 1;//take horizontal free space
		gridbag.setConstraints(scrollpane,gc);
		this.add(scrollpane);

//ustawienia GridBagConstraints dla 'panel'
		gc.fill = GridBagConstraints.CENTER;//ustaw na środku
		gc.gridheight = 1;//wysokość na 1
		gc.gridwidth = GridBagConstraints.REMAINDER;//szerokość na max
		gc.weighty = 0.0;//nie zwiększaj wysokości
		gc.weightx = 0;
		gridbag.setConstraints(panel,gc);
		this.add(panel);

istotny brak jaki zauważyłem u kolegi to to że brakuje mu w kodzie tej linijki:
gridbag.setConstraints(obiekt,wytyczna);

a poza tym proponuję zerknąć na opis klas ze strony java.sun... stamtąd zaczerpnąłem wiedzę do swojej app
http://java.sun.com/j2se/1.3/docs/api/java/awt/GridBagLayout.html
http://java.sun.com/j2se/1.3/docs/api/java/awt/GridBagConstraints.html

0

tymczasowo nie programuje w javie wiec nieuzywam juz GridBagLayout ale jak pamietam sciaglem z kas dodatkowo klase ktora pomagala wprosty sposob uzywac GridBagLayout jak ktos bedzie chcial moge poszukac i zamieszcze na necie. Ogolnie polecam Eclipse lub NetBeans.

0

Witam, klasa o której wspomina kalvin to GBC.java, poniżej przedstawiam kod:

import java.awt.*;

/**
This class simplifies the use of the GridBagConstraints
class.
/
public class GBC extends GridBagConstraints
{
/
*
Constructs a GBC with a given gridx and gridy position and
all other grid bag constraint values set to the default.
@param gridx the gridx position
@param gridy the gridy position
*/
public GBC(int gridx, int gridy)
{
this.gridx = gridx;
this.gridy = gridy;
}

/**
Constructs a GBC with given gridx, gridy, gridwidth, gridheight
and all other grid bag constraint values set to the default.
@param gridx the gridx position
@param gridy the gridy position
@param gridwidth the cell span in x-direction
@param gridheight the cell span in y-direction
*/
public GBC(int gridx, int gridy, int gridwidth, int gridheight)
{
this.gridx = gridx;
this.gridy = gridy;
this.gridwidth = gridwidth;
this.gridheight = gridheight;
}

/**
Sets the anchor.
@param anchor the anchor value
@return this object for further modification
*/
public GBC setAnchor(int anchor)
{
this.anchor = anchor;
return this;
}

/**
Sets the fill direction.
@param fill the fill direction
@return this object for further modification
*/
public GBC setFill(int fill)
{
this.fill = fill;
return this;
}

/**
Sets the cell weights.
@param weightx the cell weight in x-direction
@param weighty the cell weight in y-direction
@return this object for further modification
*/
public GBC setWeight(double weightx, double weighty)
{
this.weightx = weightx;
this.weighty = weighty;
return this;
}

/**
Sets the insets of this cell.
@param distance the spacing to use in all directions
@return this object for further modification
*/
public GBC setInsets(int distance)
{
this.insets = new Insets(distance, distance, distance, distance);
return this;
}

/**
Sets the insets of this cell.
@param top the spacing to use on top
@param left the spacing to use to the left
@param bottom the spacing to use on the bottom
@param right the spacing to use to the right
@return this object for further modification
*/
public GBC setInsets(int top, int left, int bottom, int right)
{
this.insets = new Insets(top, left, bottom, right);
return this;
}

/**
Sets the internal padding
@param ipadx the internal padding in x-direction
@param ipady the internal padding in y-direction
@return this object for further modification
*/
public GBC setIpad(int ipadx, int ipady)
{
this.ipadx = ipadx;
this.ipady = ipady;
return this;
}
}

oraz kawałek kodu z użyciem tej klasy w programie, np:
setLayout(new GridBagLayout());

  add(new JLabel("From:"), new GBC(0, 0).setFill(GBC.HORIZONTAL));

  from = new JTextField(20);
  add(from, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0));

  add(new JLabel("To:"), new GBC(0, 1).setFill(GBC.HORIZONTAL));

  to = new JTextField(20);
  add(to, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0));

  add(new JLabel("SMTP server:"), new GBC(0, 2).setFill(GBC.HORIZONTAL));

  smtpServer = new JTextField(20);
  add(smtpServer, new GBC(1, 2).setFill(GBC.HORIZONTAL).setWeight(100, 0));

  message = new JTextArea();
  add(new JScrollPane(message), new GBC(0, 3, 2, 1).setFill(GBC.BOTH).setWeight(100, 100));

  comm = new JTextArea();
  add(new JScrollPane(comm), new GBC(0, 4, 2, 1).setFill(GBC.BOTH).setWeight(100, 100));

  JPanel buttonPanel = new JPanel();
  add(buttonPanel, new GBC(0, 5, 2, 1));</b>

Pozdrawiam

0

Skaarj

istotny brak jaki zauważyłem u kolegi to to że brakuje mu w kodzie tej linijki:
gridbag.setConstraints(obiekt,wytyczna);

A po co koledze ta linijka skoro podaje wytyczne w momencie dodawania layouta do komponentu ?

add(jPanel, constraints) - wystarczy w taki sposób

0

Temat ma 3 lata z hakiem. DA?! Myślę, że autor już nie poszukuje rozwiązania :)

0

Piszę dla potomnych :). Akurat szukałem tematu związanego z GridBagLayoutem. Sądzę, ze ktoś tu może jeszcze trafić, wszak forum jest dla ogółu :).

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