Problem mit JScollPane

mrno

Erfahrenes Mitglied
Hi,
habe folgenden Code:
Code:
import java.awt.Button;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.TextField;

import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Table extends JScrollPane{
	
	GridBagLayout gbl = new GridBagLayout();
	public Table(){
		getViewport().setLayout(gbl);
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.weightx=100;
		gbc.weighty=150;
		gbc.insets= new Insets(0,5,10,15);
		
		Button b1= new Button("Hallo");
		Button b2= new Button("Cool");
		Button b3= new Button("Naja");
		
		TextField tf1 = new TextField("text");
		
		gbc.gridx=0;
		gbc.gridy=0;
		gbc.gridwidth=1;
		gbc.gridheight=1;
		gbl.setConstraints(b1,gbc);
		getViewport().add(b1);
		
		gbc.gridx=1;
		gbc.gridy=1;
		gbc.gridwidth=1;
		gbc.gridheight=2;
		gbl.setConstraints(b2,gbc);
		getViewport().add(b2);
		
		gbc.gridx=0;
		gbc.gridy=2;
		gbc.gridwidth=1;
		gbc.gridheight=3;
		gbl.setConstraints(b3,gbc);
		getViewport().add(b3);
		
		gbc.gridx=0;
		gbc.gridy=3;
		gbc.gridwidth=1;
		gbc.gridheight=4;
		gbl.setConstraints(tf1,gbc);
		getViewport().add(tf1);
	}
}

Mein Problem ist das alles im JScrollPane übereinander gezeichnet wird und das Layout nicht berücksichtigt wird.
Das JScrollPane wird in einem Frame geladen.

Code:
       JFrame f = new JFrame();
       f.setBounds(new Rectangle(100,100));
       f.setLayout(null);
       Table t = new Table();
       t.setBounds(new Rectangle(0,0,100,100));
       f.add(t,null);
       f.setVisible(true);

Eigendlich müsste bei der Größe des JScrollPane die ScrollBar activ werden macht es aber nicht. Was mach ich falsch?

Danke für eure Hilfe
mrno
 
Hallo mrno,

ich weiß zwar nicht ganz genau wie später deine GUI aussehen soll. Mir kommt es aber so vor, das du einiges falsch machst um nicht zu sagen alles.

Hab auf die schnelle mit deinen Komponenten etwas gebastelt. Kannst dann selber schauen, was du falsch gemacht hast.

Auch wendest du Gridbaglayout falsch an.

Schau mal unter folgenden Links nach:
http://www.dpunkt.de/java/Programmieren_mit_Java/Oberflaechenprogrammierung/82.html
http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html

Ansonsten empfehle ich dir noch folgendes:
http://java.sun.com/docs/books/tutorial/
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html
http://www.galileocomputing.de/openbook/javainsel4/

Also wenn ich was neues in Java implementieren möchte, dann suche ich mir zunächst ein funktionierendes Beispiel das diese Komponente oder diese Technik benutzt. Und tue dann diese modifizieren. Es fällt mir viel schwieriger aus der API doku die Funktionsweise zu verstehen und diese anzuwenden. Unter denn oben genannten Links findest genug Beispiele zu fast allem und jedem.

So das waren jetzt genug Ratschläge für heute, vielleicht auch zuviele.

Ach ja noch ein letzter Hinweis. AWT und Swing Komponenten sollte man normalerweise nicht zusammen verwenden.


VG Erdal

Code:
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Table extends JPanel {

	JButton b1 = new JButton("Hallo");
	JButton b2 = new JButton("Cool");
	JButton b3 = new JButton("Naja");
	JTextArea t1 = new JTextArea();
	Dimension d = new Dimension(500,500);
	JScrollPane scroll = new JScrollPane(t1);
	
	public Table() {
		setMinimumSize(d);
		setMaximumSize(d);
		setPreferredSize(d);
		setSize(d);
		
		t1.setWrapStyleWord(true);
		t1.setLineWrap(true);
		
		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		
		GridBagLayout gbc = new GridBagLayout();
		setLayout(gbc);
		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 1;
		c.weighty = 0;
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 1;
		c.gridheight = 1;
		add(b1, c);
		
		c.gridx = 1;
		add(b2, c);
		
		c.gridx = 2;
		add(b3, c);
		
		c.fill = GridBagConstraints.BOTH;
		c.weighty = 1;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 3;
		add(scroll, c);
	}

	public static void main(String[] args) {
		Table t = new Table();
		JFrame f = new JFrame();
		f.setSize(300, 400);
		f.add(t);
		f.setVisible(true);
	}
}
 
Hi flashray,
thx für deine schnelle antwort. Die Links mit den Layout sind gut. Leider hast du meine frage nicht verstanden. Ich möchte die buttons in einem JScollPane laden. Die fläche wo alles nachher angezeigt werden sollte ist zu klein um alle Buttons auf einmal anzeigen zu lassen deswegen brauche ich die scroll Funktion. Man muss dem ScrollPane ein (Lightweight-)Componente hab ich gelesen. Deswegen sieht jetzt mein Code wie folgt aus.
Code:
package con.lib;

import java.awt.Button;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.TextField;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class Table extends JScrollPane{
	

	public Table(){
		setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		JPanel p = new JPanel();
		p.setLayout(null);
		JButton b1= new JButton("Hallo");
		b1.setBounds(new Rectangle(0,0,200,40));
		p.add(b1,null);
		JButton b2= new JButton("Cool");
		b2.setBounds(new Rectangle(0,30,200,40));
		p.add(b2,null);
		JButton b3= new JButton("LolLol");
		b3.setBounds(new Rectangle(0,60,200,40));
		p.add(b3,null);
		
		JTextField tf1 = new JTextField("lol");
		tf1.setBounds(new Rectangle(0,90,200,40));
		p.add(tf1,null);
		getViewport().add(p);
		
	}
}
Die elemente werden jetzt auch richtig nacheinander dargestellt. Nun habe ich noch das Problem das die ScrollBar nicht activ wird wenn die Buttons größer sind als das JScrollPane. Was mache ich falsch? Was muss ich tun damit ich scrollen kann und alle elemente darstellen kann.
 
Hallo mrno,

hab meinen Code kleinwenig modifiziert. Ich denke das liegt jetzt etwas näher an deiner Wunschgui. Das Viewport habe ich nicht eingebaut, kannst es dann selber machen. Du solltest zuerst deine GUI in einen JPanel packen. Und das Gridbaglayout auf das JPanel anwenden. Dieses fertige Panel kannst du dann jetzt in einen JScrollPane setzten. Und dann auch die Viewports setzen.

VG Erdal

Code:
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Table extends JPanel {

	JButton b1 = new JButton("Hallo");
	JButton b2 = new JButton("Cool");
	JButton b3 = new JButton("Naja");
	JTextArea t1 = new JTextArea();
	Dimension d = new Dimension(500,500);
	
	public Table() {
		setMinimumSize(d);
		setMaximumSize(d);
		setPreferredSize(d);
		setSize(d);
		
		t1.setWrapStyleWord(true);
		t1.setLineWrap(true);
		
		//scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		
		GridBagLayout gbc = new GridBagLayout();
		setLayout(gbc);
		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 1;
		c.weighty = 0;
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 1;
		c.gridheight = 1;
		add(b1, c);
		
		c.gridx = 1;
		add(b2, c);
		
		c.gridx = 2;
		add(b3, c);
		
		c.fill = GridBagConstraints.BOTH;
		c.weighty = 1;
		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 3;
		add(t1, c);
	}

	public static void main(String[] args) {
		Table t = new Table();
		JFrame f = new JFrame();
		JScrollPane scroll = new JScrollPane(t);
		f.setSize(300, 400);
		f.add(scroll);
		f.setVisible(true);
	}
}
 
Hi,
danke für dein Code er funktioniert gut.
Habe jetzt nur eine frage. Was macht der folgende Code
Code:
				setMinimumSize(d);
				setMaximumSize(d);
				setPreferredSize(d);
				setSize(d);
Das ist ein teil der bei meinen beispielen fehlt was macht der
 
Hallo mrno,

Die Idee ist ja eine JFrame mit einer JScrollPane und ein JPanel zu erstellen.

Das JFrame und auch damit das JScrollPane bekommt mit
f.setSize(300, 400);
seine Größe zugewiesen.

Jetzt habe ich zwei Möglichkeiten. Wenn ich dem JPanel keine eigene größe zuweise. Wird er dem JFrame angepasst.

Oder ich gebe dem JPanel mittels
Dimension d = new Dimension(500,500);
setMinimumSize(d);
setMaximumSize(d);
setPreferredSize(d);
setSize(d);

seine eigene Größe. Wenn diese dann größer als das JFrame ist, werden die Scrollbalken angezeigt.

Du kannst natürlich bei setminimumsize, maximumsize etc. verschiedene Werte setzen, und bestimmen wie sich die größe des JPanel verhalten soll, wenn das JFrame kleiner oder größer wird.
Das kannst du selbst durch ausprobieren oder api doku herausfinden.

VG Erdal
 
Zurück