JTable + JScrollePane Größe "springt" beim resizen des Fensters

toretto33

Mitglied
Hallo zusammen,

bin gerade bei meinem ersten GUI und möchte eine Tabelle in einem JScrollPane darstellen.
Ich nutze das GridBagLayout. Hierbei ist mir ein Problem aufgefallen, wenn ich das Fenster erzeuge und anschließend resize, springt die Größe des JScrollpane.

Hier der Beispielcode:

Java:
package myPackage;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import javax.swing.JTabbedPane;
import javax.swing.JEditorPane;
import javax.swing.JComboBox;

public class lkjh extends JFrame {

	private JPanel contentPane;
	private JTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					lkjh frame = new lkjh();
					frame.setSize(800, 600);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public lkjh() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		JMenu mnDatei = new JMenu("Datei");
		menuBar.add(mnDatei);
		
		JMenuItem mntmOpen = new JMenuItem("Open");
		mnDatei.add(mntmOpen);
		
		JMenuItem mntmExit = new JMenuItem("Exit");
		mntmExit.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent arg0) {
				System.exit(0);
			}
		});
		
		mnDatei.add(mntmExit);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		GridBagLayout gbl_contentPane = new GridBagLayout();
		gbl_contentPane.columnWidths = new int[]{0, 0, 0, 0, 0};
		gbl_contentPane.rowHeights = new int[]{38, 0, 0, 0, 0, 0};
		gbl_contentPane.columnWeights = new double[]{0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
		gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
		contentPane.setLayout(gbl_contentPane);
		
		JButton btnAdd = new JButton("Add");
		btnAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
			}
		});
		GridBagConstraints gbc_btnAdd = new GridBagConstraints();
		gbc_btnAdd.anchor = GridBagConstraints.PAGE_START;
		gbc_btnAdd.insets = new Insets(0, 0, 5, 5);
		gbc_btnAdd.gridx = 0;
		gbc_btnAdd.gridy = 0;
		contentPane.add(btnAdd, gbc_btnAdd);
		
		JScrollPane scrollPane = new JScrollPane();
		GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.weightx = 1.0;
		gbc_scrollPane.gridheight = 2;
		gbc_scrollPane.gridwidth = 2;
		gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.gridx = 1;
		gbc_scrollPane.gridy = 0;
		contentPane.add(scrollPane, gbc_scrollPane);
		
		table = new JTable();
		scrollPane.setViewportView(table);
		
		JButton btnDelete = new JButton("Delete");
		GridBagConstraints gbc_btnDelete = new GridBagConstraints();
		gbc_btnDelete.anchor = GridBagConstraints.PAGE_START;
		gbc_btnDelete.insets = new Insets(0, 0, 5, 5);
		gbc_btnDelete.gridx = 0;
		gbc_btnDelete.gridy = 1;
		contentPane.add(btnDelete, gbc_btnDelete);
		
		JButton btnNewButton = new JButton("Plot");
		GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
		gbc_btnNewButton.anchor = GridBagConstraints.SOUTH;
		gbc_btnNewButton.weighty = 1.0;
		gbc_btnNewButton.insets = new Insets(0, 0, 5, 5);
		gbc_btnNewButton.gridx = 2;
		gbc_btnNewButton.gridy = 2;
		contentPane.add(btnNewButton, gbc_btnNewButton);
		
		JButton btnNewButton_2 = new JButton("New button");
		GridBagConstraints gbc_btnNewButton_2 = new GridBagConstraints();
		gbc_btnNewButton_2.insets = new Insets(0, 0, 5, 5);
		gbc_btnNewButton_2.gridx = 2;
		gbc_btnNewButton_2.gridy = 3;
		contentPane.add(btnNewButton_2, gbc_btnNewButton_2);
		
		JButton btnNewButton_1 = new JButton("Exit");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
	}

}

Um das Verhalten nachzustellen einfach den Code ausführen und das Fenster in X- oder Y-Richtung verkleinern. Das Scrollpane springt bei einer gewissen Größe auf ein kleineres Format. Ich verstehe hier nicht genau warum das passiert.

Wenn die Tabelle nicht zum JSCrollpane hinzugefügt wird, funktioniert alles so wie es soll...

Ziel ist es nachher, eine definierte Größe für die Tabelle zu erhalten (z.b. 200 pixel, würde ich ja dann über ipady einstellen?) und in Y Richtung den zusätzlichen Platz beim Scrollen über den "Plot" button hinzuzufügen. Der zusätzliche Platz in X-Richtung soll die Tabelle vergrößeren, wie es im Moment auch schon funktioniert.

Gibt es noch Einstellmöglichkeiten die ich noch nicht getroffen habe?

Vielen Dank für die Hilfe!
 

Camill

Bekanntes Mitglied
Den Fehler habe ich jetzt nicht direkt gesucht, dürfte aber sicherlich irgenwo bei den Gewichtungen sein.

Habe jedoch mal einiges ausgebessert, denke das du es so haben wolltest:
Java:
public lkjh() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 450, 300);

	JMenuBar menuBar = new JMenuBar();
	setJMenuBar(menuBar);

	JMenu mnDatei = new JMenu("Datei");
	menuBar.add(mnDatei);

	JMenuItem mntmOpen = new JMenuItem("Open");
	mnDatei.add(mntmOpen);

	JMenuItem mntmExit = new JMenuItem("Exit");
	mntmExit.addMouseListener(new MouseAdapter() {
	    @Override
	    public void mouseReleased(MouseEvent arg0) {
		System.exit(0);
	    }
	});

	mnDatei.add(mntmExit);

	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);

	GridBagLayout gbl_contentPane = new GridBagLayout();
	gbl_contentPane.columnWidths = new int[] { 0, 0, 0 };
	gbl_contentPane.rowHeights = new int[] { 0, 0, 0, 0, 0 };
	gbl_contentPane.columnWeights = new double[] { 0.0, Double.MIN_VALUE, 0.0 };
	gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE, 0.0, 0.0 };
	contentPane.setLayout(gbl_contentPane);

	JButton btnAdd = new JButton("Add");
	btnAdd.addActionListener(new ActionListener() {
	    public void actionPerformed(ActionEvent arg0) {
	    }
	});
	GridBagConstraints gbc_btnAdd = new GridBagConstraints();
	gbc_btnAdd.anchor = GridBagConstraints.WEST;
	gbc_btnAdd.fill = GridBagConstraints.HORIZONTAL;
	gbc_btnAdd.gridx = 0;
	gbc_btnAdd.gridy = 0;
	gbc_btnAdd.insets = new Insets(0, 0, 5, 5);
	contentPane.add(btnAdd, gbc_btnAdd);

	JScrollPane scrollPane = new JScrollPane();
	GridBagConstraints gbc_scrollPane = new GridBagConstraints();
	gbc_scrollPane.anchor = GridBagConstraints.WEST;
	gbc_scrollPane.fill = GridBagConstraints.HORIZONTAL;
	gbc_scrollPane.gridx = 1;
	gbc_scrollPane.gridy = 0;
	gbc_scrollPane.gridwidth = 2;
	gbc_scrollPane.gridheight = 3;
	gbc_scrollPane.insets = new Insets(0, 0, 5, 5);
	gbc_scrollPane.fill = GridBagConstraints.BOTH;
	contentPane.add(scrollPane, gbc_scrollPane);

	table = new JTable();
	scrollPane.setViewportView(table);

	JButton btnDelete = new JButton("Delete");
	GridBagConstraints gbc_btnDelete = new GridBagConstraints();
	gbc_btnDelete.anchor = GridBagConstraints.WEST;
	gbc_btnDelete.fill = GridBagConstraints.HORIZONTAL;
	gbc_btnDelete.gridx = 0;
	gbc_btnDelete.gridy = 1;
	gbc_btnDelete.insets = new Insets(0, 0, 5, 5);
	contentPane.add(btnDelete, gbc_btnDelete);

	JButton btnNewButton = new JButton("Plot");
	GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
	gbc_btnNewButton.anchor = GridBagConstraints.WEST;
	gbc_btnNewButton.fill = GridBagConstraints.HORIZONTAL;
	gbc_btnNewButton.gridx = 2;
	gbc_btnNewButton.gridy = 3;
	gbc_btnNewButton.insets = new Insets(0, 0, 5, 5);
	contentPane.add(btnNewButton, gbc_btnNewButton);

	JButton btnNewButton_2 = new JButton("New button");
	GridBagConstraints gbc_btnNewButton_2 = new GridBagConstraints();
	gbc_btnNewButton_2.anchor = GridBagConstraints.WEST;
	gbc_btnNewButton_2.fill = GridBagConstraints.HORIZONTAL;
	gbc_btnNewButton_2.gridx = 2;
	gbc_btnNewButton_2.gridy = 4;
	gbc_btnNewButton_2.insets = new Insets(0, 0, 5, 5);
	contentPane.add(btnNewButton_2, gbc_btnNewButton_2);

	JButton btnNewButton_1 = new JButton("Exit");
	btnNewButton_1.addActionListener(new ActionListener() {
	    public void actionPerformed(ActionEvent e) {
		System.exit(0);
	    }
	});
}

Ansonsten einfach mal ein Bild hochladen wie das ganze hinterher aussehen soll, denn bisher erscheint mir das GridbagLayout überflüssig.
 

toretto33

Mitglied
Hi,

vielen Dank schonmal für die Antwort.
Ziel ist jedoch nicht das Scrollpane zu strecken, sondern soll es in Y-Richtung möglichst die gleiche Größe behalten.

Ich füge mal 2 Bilder hinzu wo das Problem zu sehen ist.

Auf dem 1. Bild ist die Größe direkt nach dem Start.

java-forum.org

Wenn man das Fenster nun nach unten vergrößert "springt" die Größe des Scrollpanes auf einmal...

java-forum.org

Woran kann das liegen?

Ziel wäre eben, dass die Größe des Scrollpanes wie auf dem 1. Bild gleich bleibt und der zusätzliche freie Raum leer ist wie hier:

http://www.java-forum.org/attachment.php?attachmentid=5538&stc=1&d=1356548772
 

Anhänge

  • GUIOK.png
    GUIOK.png
    38,2 KB · Aufrufe: 38
  • GUIgesprungen.png
    GUIgesprungen.png
    50,3 KB · Aufrufe: 35
  • GUIZiel.png
    GUIZiel.png
    45,1 KB · Aufrufe: 32
Zuletzt bearbeitet:

Camill

Bekanntes Mitglied
Hmm, hatte selbst noch nie Probleme damit. Habe soeben aber rausgefunden das man das ganze durch setzen der 'ScrollableViewportSize' ([japi]JTable#setPreferredScrollableViewportSize(java.awt.Dimension)[/japi]) lösen kann.
 

toretto33

Mitglied
Ok, diese Methode von Dir zusammen mit der Methode des Scrollpanes
scrollPane.setMinimumSize(new Dimension(1,300));

hat es dann funktioniert :)

Danke!
 

Neue Themen


Oben