Swing Layout-Problem mit JTables und JLists (Mindestgrößen)

Status
Nicht offen für weitere Antworten.
K

Kaffeemaschinist

Gast
Hallo!

Ich hab vor kurzen ein Layout zusammengebastelt, das aber immer mal wieder nicht so richtig will. Vermutlich bin ich noch zu unerfahren mit solchen Sachen, deswegen frag ich an dieser Stelle mal nach generellen Ratschlägen.

Hier die Erklärung: (siehe auch den angehängten Screenshot)
Das Fenster nimmt die maximale Bildschirmgröße ein, kann, nachdem es gestartet wird, aber nicht mehr verkleinert/vergrößert werden. Außerdem kann ich dafür sorgen, dass eine bestimmte Mindestauflösung (z.B. 1024x768) zur Verfügung steht, damit Mindestmaße erfüllt werden können.

Die Teile 5+6+7 sollen so nebeneinander passen, dass 7 eine Standardbreite bekommt und 5 und 6 sich in einem bestimmten Verhältnis die restliche Breite teilen. 1. Frage: Geht das überhaupt?
Die Höhe dieses 3er-Blocks soll festgelegt sein über den Inhalt. Dafür gebe ich den JLists in 5 und 7 vor, dass sie mind. X Elemente beinhalten (über JList.setVisibleRowCount(x)). Nächste Frage: Wie gebe ich eine Mindest_breite_ für diese Listen an? Die Listen sollen mindestens x Pixel breit sein, der Rest soll sich verhältnismäßig aufteilen, so dass die Gesamtbreite genutzt wird.

Und als letzte Frage:
Block 3 soll die maximale Höhe erreichen. Danach möchte ich ausrechnen, wieviel Zeilen ich in die Tabelle reinbekomme. Über JTable.getRowHeight() sollte das möglich sein. Nur: Wenn ich es schaffe, die maximale Höhe zu setzen, liegt diese dann auch sofort an? Oder baut sich das Layout erst auf die Größe aus, wenn ich die GUI mit Daten fülle (was asynchron geschieht)?

Bisher hab ich das mit nem GridBagLayout gemacht, was aber in einigen Fällen, wenn ich keine fixe Größe für einige Elemente festgelegt habe, dazu führte, dass das Layout kollabierte (alle Elemente schrumpfen aufs Minimum).

Mit einem Layoutwerkzeug hab ich bisher auch keine guten Erfahrung gemacht, da kam nix bei rum.

Danke fürs Lesen,
Kaffeemaschinist
 

André Uhres

Top Contributor
Das Problem mit 5+6+7 dürfte mit GridBag zu lösen sein: preferredSize für 7 und der Rest mit Gewichten. Die Breite der Liste könnten wir mit preferredSize festsetzen. Als Grundgerüst können wir ein BorderLayout nehmen mit 1+2 im Norden, 3 im Zentrum und der Rest im Süden. 3 beansprucht dann automatisch allen verfügbaren Platz.
 
K

Kaffeemaschinist

Gast
Vielen Dank für den Hinweis!

5 und 7 sind jeweils Listen in JScrollPanes, die ich ja mit setMinimumSize auf die Mindestgröße bringen kann. Leider scheint es, dass, sobald ein Listeneintrag sehr lang ist, die gesamte Darstellung von 5+6+7 kollabiert (alles fällt auf winzige Größe zurück). Das sollte doch eigentlich in JScrollPanes gar nicht passieren, oder?

Außerdem: In 3 befindet sich ja eine Tabelle. Diese wird seitenweise dargestellt. Um die Einträge, die ich pro Seite aus der Datenbank lade, festzustellen, muss ich die gelayoutete Größe dieses Elements wissen.

Ist es richtig, dass ich das einfach über JTable.getSize() mache? Oder über die JScrollPane, die den JTable umfasst? Und vor allem: Wie kann ich sicherstellen, dass mein JTable bereits gelayoutet wurde, ich also nicht eine Größe von 0,0 zurückbekomme? Die Zeichenoperationen laufen ja asynchron ab, also kann ich nicht sicher gehen, dass nach einem setVisible(true) des gesamten Containers bereits das Layout steht.
 

André Uhres

Top Contributor
Versuch mal, JScrollPane so zu konfigurieren, daß die Scrollbars immer erscheinen. Für JTable würde ich mit getVisibleRect arbeiten und mit invokeLater synchronisieren.
 
K

Kaffeemaschinist

Gast
Versuch mal, JScrollPane so zu konfigurieren, daß die Scrollbars immer erscheinen.

Die Vermutung, dass das Layout durch die hinzukommenden Scrollbars zerstört wird, hat sich (leider) nicht bewahrheitet: Man _muss_ scheinbar per JScrollPane.setPreferredSize() eine Größe für die JScrollPane angeben, ansonsten versucht sich diese so zu vergrößern, dass der Inhalt ohne Scrolling in sie hineinpasst. Andererseits möchte man doch gar nicht diese Größe angeben, sondern so etwas sagen wie: "Vergrößer dich solange, bis der Platz nicht mehr reicht". Geht das dann noch?

Für JTable würde ich mit getVisibleRect arbeiten und mit invokeLater synchronisieren.

Ist damit etwas ähnlich diesem Thread gemeint? http://www.java-forum.org/awt-swing-swt/80231-jtable-getvisiblerect-event.html

Ich nehme an, man würde auf eine Änderung "warten" und den JTable dann mit der Funktion "abmessen". Aber wie synchronisiert man das mit invokeLater()?

Als Beispiel: Die Tabelle wird datenlos vorbereitet und einer invokeLater() mit der Messfunktion ausgeführt, dann die Tabelle angezeigt (setVisible() auf Container). invokeLater() könnte trotzdem zu früh dran kommen, so dass die getVisibleRect() falsche Daten rausgibt.
 

André Uhres

Top Contributor
Da die Swing GUI Prozesse alle auf dem EventDispatchThread laufen (auch das Starten der GUI soll mit invokeLater geschehen), kann invokeLater in der Regel nie zu früh kommen. Die Methode synchronisiert in dem Sinn, daß der Prozess in die EventDispatchThread Warteschlange aufgenommen wird, also erst dran kommt, wenn alle anstehenden GUI Prozesse abgeschlossen sind.
 

Ebenius

Top Contributor
Die Vermutung, dass das Layout durch die hinzukommenden Scrollbars zerstört wird, hat sich (leider) nicht bewahrheitet: Man _muss_ scheinbar per JScrollPane.setPreferredSize() eine Größe für die JScrollPane angeben, ansonsten versucht sich diese so zu vergrößern, dass der Inhalt ohne Scrolling in sie hineinpasst.
Am Rande: Die Komponente die als View auf dem Viewport einer JScrollPane liegt, sollte das [c]Scrollable[/c]-Interface implementieren. Da kann sich dann der Inhalt der ScrollPane wünschen, wie groß die ScrollPane werden soll, ob er sich der Höhe und/oder Breite des JScrollPane's anzupassen gedenkt, wie weit die Schritte beim "blättern" sind. Einige Komponenten wie JTable, JList, JEditorPane, ... implementieren diese Schnittstelle, weil sie normaler Weise in JScrollPanes vorkommen. Wenn man ein JPanel scrollen lassen möchte, sollte man eine Ableitung von JPanel erzeugen und diese die Schnittstelle implementieren lassen.

Ebenius
 
K

Kaffeemaschinist

Gast
Am Rande: Die Komponente die als View auf dem Viewport einer JScrollPane liegt, sollte das [c]Scrollable[/c]-Interface implementieren. Da kann sich dann der Inhalt der ScrollPane wünschen, wie groß die ScrollPane werden soll, ob er sich der Höhe und/oder Breite des JScrollPane's anzupassen gedenkt, wie weit die Schritte beim "blättern" sind. Einige Komponenten wie JTable, JList, JEditorPane, ... implementieren diese Schnittstelle, weil sie normaler Weise in JScrollPanes vorkommen. Wenn man ein JPanel scrollen lassen möchte, sollte man eine Ableitung von JPanel erzeugen und diese die Schnittstelle implementieren lassen.

Ebenius

Sehr interessant, wusste ich noch nicht mit dem Scrollable-Interface. Bei mir ist es leider so, dass ich JLists in die JScrollPanes packe, also diese Vorgabe erfüllt sein müsste. Die JList liegt auch direkt im ScrollPane, ohne erst noch auf ein Panel oder irgendeinen anderen Container zu liegen.
 
K

Kaffeemaschinist

Gast
Nachdem ich eine Woche immer wieder mit verschiedensten Layouts rumgekaspert habe, geb ich es auf.
Entweder der LayoutManager bekommt die Sache nicht in den Griff (z.B. BorderLayout lässt trotz expliziter Größenangabe des südlichen Bereichs diesem zu wenig Platz) oder die Mindestangaben werden nicht interpretiert oder es bleiben Leerstellen auf dem Bildschirm.

Vermutlich bleibt mir nix anderes übrig, als selbst einen LayoutManager zu bauen, was ich im Prinzip nun schon habe. Trotzdem furchtbar!

Thread kann als gelöst markiert werden.
 

Ebenius

Top Contributor
Ich bezweifele das. BorderLayout schert sich nicht um die [c]minimumSize[/c]. BorderLayout richtet sich nur nach der [c]PreferredSize[/c]. Wenn Du sagst, Du hast explizit die Größe gesetzt; mit [c]setSize(...)[/c]? Nimm [c]setPrefferedSize(...)[/c], dann geht's bestimmt. Ansonsten: Veröffentliche doch einfach ein Stück Quelltext, dann finden wir eine Lösung ohne eigenen LayoutManager.

Ebenius
 
K

Kaffeemaschinist

Gast
SetSize nutze ich nur, wenn ich sehr verzweifelt bin, denn ich hab immer Befürchtungen, dass es den LayoutManager aushebelt, sobald ich feste Größen nutze.

Im Anschluss mein Code, den ich aus diversen Files zusammengesetzt habe (minus der GUI-Funktionalität), damit er etwas leichter zu durchschauen ist. Falls das Ding etwas zu schwer zu durchdenken ist, kann ich gern noch eine Skizze geben, welches Panel wo eingeordnet ist, um die Sache zu erleichtern.

Das Beispiel ist natürlich startbar, wobei ich es zZt auf 1280x1024 darstelle (dass es für kleinere Auflösungen funktioniert, darum geht's in diesem Experiment).

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.util.Hashtable;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;




/**
 * <p>Frame containing a paginated list of transactions (including their effective GVC rules)
 * and a few GUI elements to create/edit/delete <code>{@link Rule}s</code> .</p>
 * 
 * <p>Changes in one of the two lists are reflected immediately in display.</p>
 * 
 * @author Paule
 */
public class TestLayoutView {

	private static final long 			serialVersionUID = 9139718415334230659L;
	 
//	/**
//	 * Page size when viewing <code>{@link Transaction}s</code>. 
//	 * Value is computed and depends on screen size of display.
//	 */
//	private int							transactionsPerPage;
	
	
	/* GUI elements */
	
	/** Combobox for displaying all <code>{@link GVC}</code> objects. */
	private JComboBox					gvcComboBox;
	
	/** List for displaying GVC rules. */
	private JList						gvcRuleList;
	/** List for displaying exception elements. */
	private JList						exceptionList;
	
	/** Main panel to which all components of this frame are attached. */ 
	private JPanel						mainPanel;
	
	/** Button to add a rule to list. */
	private JButton						addRuleButton;
	/** Button to delete a rule from list. */
	private JButton						deleteRuleButton;
	/** Button to update an always-existing rule in list. */
	private JButton						updateRuleButton;
	/** Button to cancel the creation of a rule. */
	private JButton						cancelRuleButton;
	/** Button to add all visible elements as exception to list. */
	private JButton						addAllVisibleAsExceptionButton;
	/** Button to add a exception element to list. */
	private JButton						addExceptionButton;
	/** Button to delete a exception element from list. */
	private JButton						deleteExceptionButton;
	/** Button to test a SQL where clause. */
	private JButton						testWhereClauseButton;
	
		
	
	/** Text field for editing the priority of a GVC rule. This element is linked to a slider. */
	private JTextField					gvcPriorityField;
	
	/** Text field for editing the optional description of a GVC rule. */
	private JTextField					gvcDescriptionField;
	
	/** Multiline text field for editing the where clause of a GVC rule. */
	private JTextArea					gvcWhereClauseField;
	
	/** Slider for adjusting the priority of a GVC rule. This element is linked to a textfield. */
	private JSlider						gvcPrioritySlider;
	
	
	/**	Table with for paginated data view. */
	protected JTable					paginatedTable;

	
	
	
	
	private	JFrame						frame;

	
	private final static String			BROWSE_DATA_HEADLINE_TEXT = 
		"Browse working data set";
		
	
	
	
	

	private Insets						screenInsets;
	/** Measured maximum dimension of any GUI frame (depends on user display). */
	private Dimension					maxFrameDimension;
	/** Measured dimension of physical display. */
	private Dimension 					physicalDimension;
	
	
	
	
	public void 					fillTestData() {
		
		/* paginated table in middle of screen */
		final DefaultTableModel tableModel = (DefaultTableModel)this.paginatedTable.getModel();
		
		
		Object[] row = {0, "data", "buikbuikbuik", "Bitch Death Teenage Mucousi Monster From Hell",
				"lips", "um", "lorum", "anvil", "löffelsteel","Kernspaltaxt","Heizol","hacken",
				"Unsinn","Unsinn","Unsinn","Unsinn","Unsinn","Unsinn"};
		for (int i=1; i<row.length; ) {
			tableModel.addColumn("col "+(++i));
		}
		
		for (int i=0; i<50; i++) {
			
			row[0] = ((Integer)row[0])+1;
			tableModel.addRow(row);
		}
		
		
		/* rule list to the left */
		DefaultListModel listModel = (DefaultListModel)gvcRuleList.getModel();
		
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement(11111);
		listModel.addElement("Es könnte noch weitere Antworten auf das Thema geben, jedoch erhalten Sie keine zusätzlichen Benachrichtigungen, bis Sie das Forum wieder");
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement("hello");
		listModel.addElement("world");
		
		
		/* exception list to the rightt */
		listModel = (DefaultListModel)exceptionList.getModel();
		listModel.addElement("world");
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement("hello");
		listModel.addElement("world");
		listModel.addElement("1world");
		listModel.addElement("2hello");
		listModel.addElement("3world");
		listModel.addElement("4hello");
		listModel.addElement("5world");
		listModel.addElement("6hello");
		listModel.addElement("77777777777777world");
		
		
		
		
		
		
	}
	
	
	
	private JPanel					getCombinedEditPanel() {
		
		
	
		/* GVC rule list and list buttons */
		this.gvcRuleList = new JList();
		this.gvcRuleList.setModel(new DefaultListModel());
		this.gvcRuleList.setVisibleRowCount(12);
		this.gvcRuleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		this.addRuleButton = new JButton ("Add");
		this.deleteRuleButton = new JButton ("Remove");
	
		
			
		
		
		/* excludes list and buttons */
		this.exceptionList = new JList();
		this.exceptionList.setVisibleRowCount(12);
		this.exceptionList.setModel(new DefaultListModel());
		this.exceptionList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		this.addAllVisibleAsExceptionButton = new JButton ("Add all visible as exception");
		this.addExceptionButton = new JButton ("Add");
		this.deleteExceptionButton = new JButton ("Remove");
	
		
		
		/* Bottom part with:
		 * - search panel, pagination panel (top part)
		 * - GVC rule list, GVC rule edit panel, GVC rule exceptions (middle part)
		 * - buttons for list, panel and list (bottom part)
		 * 
		 * Again, this is a BorderLayout.
		 */
		final JPanel combinedEditPanel = new JPanel(new BorderLayout());
		JPanel panel2 = new JPanel (new BorderLayout());
		final GridBagConstraints constraint = new GridBagConstraints();
		
		panel2.add(this.getPaginationControlPanel(), BorderLayout.WEST);
		panel2.add(this.getSearchPanel(), BorderLayout.EAST);
		combinedEditPanel.add(panel2, BorderLayout.NORTH);
		
		panel2 = new JPanel (new GridBagLayout());
		
		/* head labels */
		constraint.gridx = 0;
		constraint.fill = GridBagConstraints.BOTH;
		constraint.insets.left = constraint.insets.right = 5;
		constraint.gridy = 0;
		panel2.add(new JLabel("GVC rules"));
		
		constraint.gridx++;
		panel2.add(new JLabel("Edit rule"));
		
		constraint.gridx++;
		panel2.add(new JLabel("GVC rule exceptions"));
		
		/* center lists, edit fields */
		constraint.gridx = 0;
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 0.5;
		constraint.gridy ++;
		
		final JScrollPane gvcRuleListScrollPane = new JScrollPane(
				this.gvcRuleList,
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		panel2.add(gvcRuleListScrollPane, constraint);
	
		
		constraint.gridx++;
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 1.;
		panel2.add(this.getGVCRuleEditPanel(),constraint);
		
		constraint.gridx++;
		constraint.weightx = 0.;
		final JScrollPane exceptionListScrollPane = new JScrollPane(
				this.exceptionList,
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		panel2.add(exceptionListScrollPane, constraint);
		
		
		/* bottom line buttons (two buttons per panel) */
		JPanel buttonPanel = new JPanel(new FlowLayout());
		buttonPanel.add(this.addRuleButton);
		buttonPanel.add(this.deleteRuleButton);
		constraint.gridx = 0;
		constraint.gridy ++;
		panel2.add(buttonPanel,constraint);
		
		buttonPanel = new JPanel(new FlowLayout());
		buttonPanel.add(this.cancelRuleButton);
		buttonPanel.add(this.updateRuleButton);
		constraint.gridx++;
		panel2.add(buttonPanel,constraint);
		
		buttonPanel = new JPanel(new FlowLayout());
		buttonPanel.add(this.addExceptionButton);
		buttonPanel.add(this.deleteExceptionButton);
		constraint.gridx++;
		panel2.add(buttonPanel,constraint);
		
		combinedEditPanel.add(panel2, BorderLayout.CENTER);
		
		
		return combinedEditPanel;
	}


	/**
	 * @return
	 */
	private JPanel					getGVCRuleEditPanel() {
		
		final JPanel 				ruleEditPanel = new JPanel(new GridBagLayout());
		final GridBagConstraints 	constraint	  = new GridBagConstraints();
		
		
		/* prepare GUI elements */
		this.updateRuleButton = new JButton("Save/Update");
		this.cancelRuleButton = new JButton("Cancel creation");
		this.testWhereClauseButton = new JButton("Test");
	
		this.gvcWhereClauseField = new JTextArea(2,30);
		this.gvcWhereClauseField.setLineWrap(true);
		this.gvcWhereClauseField.setWrapStyleWord(true);
		
		this.gvcComboBox = new JComboBox();
		
		this.gvcPrioritySlider =	new JSlider(0,999,999);
		Hashtable<Integer, JComponent> sliderLabels = new Hashtable<Integer, JComponent>();
		sliderLabels.put(0, new JLabel("min"));
		sliderLabels.put(500, new JLabel("medium"));
		sliderLabels.put(999, new JLabel("max"));
		this.gvcPrioritySlider.setLabelTable(sliderLabels);
		this.gvcPrioritySlider.setMajorTickSpacing(100);
		this.gvcPrioritySlider.setPaintTicks(true);
		this.gvcPrioritySlider.setPaintLabels(true);
	
		/* listen on changes in this slider to update text field */
		this.gvcPriorityField =	new JTextField(3);
		this.gvcWhereClauseField.setBorder(this.gvcPriorityField.getBorder());
		this.gvcDescriptionField = new JTextField(30);
		
		/* layout components */
		
		/* left column: code (label)*/
		constraint.gridx = 0;
		constraint.gridy = 0;
		ruleEditPanel.add(new JLabel("code",SwingConstants.LEFT),constraint);
		
		/* left column: where clause (label) and test button */
		constraint.gridy++;
		final JPanel wherePanel = new JPanel(new GridLayout(2,1));
		wherePanel.add(new JLabel("where clause",SwingConstants.LEFT));
		wherePanel.add(this.testWhereClauseButton);
		ruleEditPanel.add(wherePanel,constraint);
		
		/* left column: priority (label) */
		constraint.gridy++;
		ruleEditPanel.add(new JLabel("priority",SwingConstants.LEFT),constraint);
		
		/* left column: description (label) */
		constraint.gridy++;
		ruleEditPanel.add(new JLabel("description",SwingConstants.LEFT),constraint);
	
		/* right column: code (combo box) */
		constraint.gridx = 1;
		constraint.gridy = 0;
		ruleEditPanel.add(this.gvcComboBox,constraint);
		
		/* right column: where clause (edit field) */
		constraint.gridy++;
		ruleEditPanel.add(new JScrollPane(this.gvcWhereClauseField),constraint);
		
		/* right column: priority (display and slider) */
		constraint.gridy++;
		JPanel priorityPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,30,0));
		priorityPanel.add(this.gvcPriorityField);
		priorityPanel.add(this.gvcPrioritySlider);
		ruleEditPanel.add(priorityPanel,constraint);
	
		/* right column: decription (edit field) */
		constraint.gridy++;
		ruleEditPanel.add(this.gvcDescriptionField,constraint);
		
		return ruleEditPanel;
	}


	private JPanel					getPageInputPanel() {
		
		/* prepare initial, writable components */
		final JPanel panel					= new JPanel(new GridBagLayout());
		/* total pages */
		final JLabel totalPagesTextField	= new JLabel();
		/* selected page */
		final JTextField selectedPageTextField	= new JTextField(5);
		
		
		
		final GridBagConstraints constraint = new GridBagConstraints();
		
		constraint.gridwidth = 3;
		constraint.gridx = 0;
		constraint.gridy = 0;
		panel.add(new JLabel("Page"),constraint);
		
		constraint.gridwidth = 1;
		constraint.gridy++;
		panel.add(selectedPageTextField,constraint);
		
		constraint.gridx++;
		panel.add(new JLabel(" / "),constraint);
		
		constraint.gridx++;
		panel.add(totalPagesTextField,constraint);
		
		
		return panel;
	}
	
	
	private JPanel					getPaginationControlPanel() {
		
		
		/** JPanel with paginate buttons and pageInputPanel. */
		final				JPanel				paginateControlPanel;
		/** Button to switch to next displayable page. */
		final				JButton				nextPageButton;
		/** Button to switch to previous displayable page. */
		final				JButton				prevPageButton;
		/** Button to switch to first displayable page. */
		final				JButton				firstPageButton;
		/** Button to switch to last displayable page. */
		final				JButton				lastPageButton;
		
		
		
		/* instantiate predefined buttons for pagination scrolling */
		firstPageButton = new JButton("<<"); 
		prevPageButton = new JButton("<");
		nextPageButton = new JButton(">");
		lastPageButton = new JButton(">>");


		/* add bottom line buttons and page input panel */
		paginateControlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,5,0));

		paginateControlPanel.add(firstPageButton);		
		paginateControlPanel.add(prevPageButton);
		paginateControlPanel.add(getPageInputPanel());
		paginateControlPanel.add(nextPageButton);
		paginateControlPanel.add(lastPageButton);
		
		return paginateControlPanel;
	}
	
	
	private JPanel 					getSearchPanel() {
		
		final JPanel					panel = new JPanel (new FlowLayout());
		/* Text area for search string input. */
		final JTextField				textField = new JTextField(25);
		/* Click on this button to start the search. */
		final JButton					searchButton = new JButton("Search");
		
		panel.add(textField);
		panel.add(searchButton);
		
		
		return panel;
	
	}


	/**
	 * @return
	 */
	private JPanel					getBrowsePanel() {
		
		final JPanel				browsePanel	  = new JPanel(new BorderLayout());
		
		

		/** Button group for JRadioButtons in browse view. */
		final ButtonGroup					browseButtonGroup;
		/** Radio button for showing all transactions. */
		final JRadioButton				showAllRadioButton;
		/** Radio button for showing only transactions connected to 1 GVC rule. */
		final JRadioButton				showSingleConnectedRadioButton;
		/** Radio button for showing only transactions connected to more than 1 GVC rule. */
		final JRadioButton				showMultiConnectedRadioButton;
		/** Radio button for showing only transactions connected to no GVC rule. */
		final JRadioButton				showUnconnectedRadioButton;
		
		/** JLabel for browse information. */
		final			JLabel				browseInfoLabel;
		
		/* init top radio buttons for switching view mode */
		showAllRadioButton = new JRadioButton("all");
		showSingleConnectedRadioButton = new JRadioButton("single connected");
		showSingleConnectedRadioButton.setBackground(	new Color(128,255,128));
		showMultiConnectedRadioButton = new JRadioButton("multi connected  ");
		showMultiConnectedRadioButton.setBackground( new Color(255,128,128));
		showUnconnectedRadioButton = new JRadioButton("free                         ");
		showUnconnectedRadioButton.setBackground(	new Color(255,255,128));
		
		browseButtonGroup = new ButtonGroup();
		browseButtonGroup.add(showAllRadioButton);
		browseButtonGroup.add(showSingleConnectedRadioButton);
		browseButtonGroup.add(showMultiConnectedRadioButton);
		browseButtonGroup.add(showUnconnectedRadioButton);
		showAllRadioButton.setSelected(true);
		
		/* browse info label */
		browseInfoLabel = new JLabel(BROWSE_DATA_HEADLINE_TEXT);
		
		/* lay out elements */
		Box innerboxLeft = Box.createVerticalBox();
		innerboxLeft.add(showAllRadioButton);
		innerboxLeft.add(showSingleConnectedRadioButton);
		Box innerboxRight = Box.createVerticalBox();
		innerboxRight.add(showMultiConnectedRadioButton);
		innerboxRight.add(showUnconnectedRadioButton);
		
		Box outerBox = Box.createHorizontalBox();
		outerBox.add(innerboxLeft);
		outerBox.add(innerboxRight);

		browsePanel.add(browseInfoLabel,BorderLayout.WEST);
		browsePanel.add(outerBox,BorderLayout.EAST);
		
		
		return browsePanel;
		
	}
	
	/**
	 * <p>Inits some screen size dimensions:</p>
	 * <ul>
	 * <li>physical screen size</li>
	 * <li>maximum size of a frame</li>
	 * <li>maximum size of a component in a frame</li>
	 * </ul>
	 */
	private void					initScreenSizeProps() {
	
	
		/* 
		 * Get max dimension from toolkit. Beware: this dimension includes OS elements like
		 * toolbars.
		 */
		this.physicalDimension = Toolkit.getDefaultToolkit().getScreenSize();
		
		this.screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(
				GraphicsEnvironment.getLocalGraphicsEnvironment()
					.getDefaultScreenDevice().getDefaultConfiguration());
		
	
		this.maxFrameDimension = new Dimension(
				this.physicalDimension.width - screenInsets.left - screenInsets.right,
				this.physicalDimension.height - screenInsets.top - screenInsets.bottom);
		
		/*
		 * Create a frame, maximize it and display it for a short time to get maximum
		 * dimension. Inside the frame, place a panel with maximum dimension.
		 */
		final JFrame testFrame = new JFrame();
	
		testFrame.setSize(this.maxFrameDimension);
		testFrame.setVisible(true);
		testFrame.validate();
		testFrame.dispose();		
	}



		/**
	 * <p>Set frame's prefered size, and position it in frame (optionally centered).</p>
	 * 
	 * @param view
	 * @param preferedWidth
	 * @param preferedHeight
	 * @param centered
	 */
	private void					setViewSizeAndPosition () {
		
		this.frame = new JFrame();
		
		
		/* dimension can not be greater than maximum frame dimension */
		Dimension newFrameSize = new Dimension (
				this.maxFrameDimension.width,
				this.maxFrameDimension.height
		);
		this.frame.setSize(newFrameSize);
		
		/* centered on display */
		this.frame.setLocation(
				(this.maxFrameDimension.width - newFrameSize.width) / 2 + this.screenInsets.left,
				(this.maxFrameDimension.height - newFrameSize.height) / 2 + this.screenInsets.top
			);
	
		/* frame is unresizable */
		this.frame.setResizable(false);
		
		this.frame.setContentPane(this.mainPanel);
	}


		/* (non-Javadoc)
		 * @see gui.frame.AbstractView#initializeGUIComponents()
		 */
		public void				setVisible() {
			
			this.initScreenSizeProps();
			
			/* browse data table */		
			this.paginatedTable = new JTable();
			this.paginatedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		
			
			
			/* init frame and it's panel */
			this.mainPanel							= new JPanel(null);
			this.mainPanel.setLayout( new BorderLayout());
			this.mainPanel.add(this.getBrowsePanel(),BorderLayout.NORTH);
	
			/* middle console of paginated data */
			final JScrollPane paginatedTableScrollPane = new JScrollPane(
					this.paginatedTable,
					JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
					JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
			this.mainPanel.add(paginatedTableScrollPane,BorderLayout.CENTER);
			this.mainPanel.add(getCombinedEditPanel(),BorderLayout.SOUTH);
			
			/* frame properties */
			this.setViewSizeAndPosition();
			
		
//			/* Size JLists manually, because long entries in lists kill layout. */ 
//			SwingUtilities.invokeLater(new Runnable() {
//				
//				@Override
//				public void run() {
//	
//					final int exceptionListWidth = 200;
//					
//					gvcRuleList.setSize(     new Dimension(
//						gvcRuleList.getWidth(),
//						gvcRuleList.getFixedCellHeight() * 12)
//					);
//	
//					/* set fixed width of right hand exception list */ 
//					exceptionList.setSize(	new Dimension(
//							exceptionListWidth,
//							exceptionList.getFixedCellHeight() * 12 ));
//	
//	
//					/* compute maximum height of transaction table */
//					final int paginatedTableHeight = paginatedTable.getHeight();
//					
//					transactionsPerPage = 
//						((int)paginatedTableScrollPane.getVisibleRect().getHeight() 
//								- paginatedTableScrollPane.getHorizontalScrollBar().getHeight())  
//						/ paginatedTable.getRowHeight();
//					paginatedTable.setPreferredSize( new Dimension(
//							(int)paginatedTableScrollPane.getVisibleRect().getWidth(),
//							transactionsPerPage * paginatedTable.getRowHeight()));
//					
//					
//				}
//			});		
			
			
			
			
			/* init pagination object */
			// TODO HACK
	//		this.transactionsPerPage = 10;
			
			
			this.frame.setVisible(true);
			
		}



	public static void main(String[] args) {
		
		
		final TestLayoutView view = new TestLayoutView();	
		
		SwingUtilities.invokeLater(new Runnable (){

			public void run() {
				view.setVisible();
				view.fillTestData();
			}});
		
		
	}
	
}
 
Zuletzt bearbeitet von einem Moderator:
K

Kaffeemaschinist

Gast
Danke für das Tag-Setzen!

Frage: Warum führt er das
Java:
JList.setVisibleRowCount(12);

in Zeile 199 und 212 nicht aus? Das müsste nämlich die gesamte Größe des Bereiches BorderLayout.SOUTH vergrößern.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Layout - Problem AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
F Layout-Problem AWT, Swing, JavaFX & SWT 2
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
A SWT Layout Problem AWT, Swing, JavaFX & SWT 15
N SWT Einfaches Problem beim Layout AWT, Swing, JavaFX & SWT 8
V Layout Problem AWT, Swing, JavaFX & SWT 5
M JPanel Layout Problem AWT, Swing, JavaFX & SWT 11
I Layout Problem beim Skalieren AWT, Swing, JavaFX & SWT 3
T Null Layout Problem. AWT, Swing, JavaFX & SWT 3
M Layout Problem: Zentriern in Panel AWT, Swing, JavaFX & SWT 3
M Layout-Problem: JTable AWT, Swing, JavaFX & SWT 3
A Layout-Problem AWT, Swing, JavaFX & SWT 5
W SWT, Anordung von Elementen - Layout Problem ? AWT, Swing, JavaFX & SWT 2
I Null-Layout-Problem AWT, Swing, JavaFX & SWT 2
M Problem mit NULL-Layout AWT, Swing, JavaFX & SWT 2
M Problem mit Layout wegen Textarea AWT, Swing, JavaFX & SWT 3
G Layout Problem AWT, Swing, JavaFX & SWT 6
M Layout / setSize Problem AWT, Swing, JavaFX & SWT 15
M Layout Problem (GrudBag- + BorderLayout) AWT, Swing, JavaFX & SWT 6
M Layout-Problem, Größe von Komponenten AWT, Swing, JavaFX & SWT 3
S Wiedermal SWT-Layout-Problem AWT, Swing, JavaFX & SWT 6
S SWT - Simples Layout Problem AWT, Swing, JavaFX & SWT 9
M Layout Problem, Ideen gesucht AWT, Swing, JavaFX & SWT 7
H Problem mit Layout Fenstern (Swing) AWT, Swing, JavaFX & SWT 3
M Layout Problem AWT, Swing, JavaFX & SWT 3
D Layout Problem / JTree und JPanel AWT, Swing, JavaFX & SWT 4
N Layout-Problem (JScrollPane, GridBagLayout) AWT, Swing, JavaFX & SWT 3
D Layout-Problem AWT, Swing, JavaFX & SWT 8
M Problem mit Layout/JLabel AWT, Swing, JavaFX & SWT 5
D Layout Problem mit Überdeckung AWT, Swing, JavaFX & SWT 6
J Kleines Layout Problem AWT, Swing, JavaFX & SWT 5
S Problem mit dem Layout - 3 JPanel's AWT, Swing, JavaFX & SWT 3
G Layout-Problem AWT, Swing, JavaFX & SWT 4
G Problem mit JDialog-Layout AWT, Swing, JavaFX & SWT 4
F Problem mit Panel-Layout AWT, Swing, JavaFX & SWT 3
M Layout Problem. AWT, Swing, JavaFX & SWT 6
E Problem mit GridBag Layout AWT, Swing, JavaFX & SWT 2
G Layout Problem AWT, Swing, JavaFX & SWT 3
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben