Mehrere JScrollpane

  • Themenstarter Themenstarter Zindal123
  • Beginndatum Beginndatum
Z

Zindal123

Hi,

ich trete schon seit einiger Zeit auf der Stelle, da ich die Organisation meiner Components nicht gebacken bekomme.

Gewünscht ist folgendes:
Ein Frame mit einer Liste und einer Tabelle nebenan. In der Liste stehen Tabellen aus einer DB, welche durch Tastendruck ein Select auslösen und das Ergebnis der Abfrage in der JTable anzeigen. Die Liste soll vertikal scrollbar sein und die Tabelle vertikal und horizontal. Separat klappt das, gemeinsam nicht.

Wie ist bei der Komponentenerstellung die Vorgehensweise? Welches Layout bietet sich an, wenn die JList ihr schmales Erscheinungsbild beibehalten soll?

Hier mal ein Auszug aus meiner Klasse mit den relevanten Methoden:

Code:
private void initialize() {
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setComponentOrientation(ComponentOrientation.UNKNOWN);
		this.setForeground(Color.white);
		this.setSize(new Dimension(600, 480));
		this.setContentPane(getJPanel());
		this.setTitle("Tabellen");
		this.setLocationRelativeTo(null);
		this.pack();
		this.setVisible(true);
	}

	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new FlowLayout());
			jPanel.setName("");
			jPanel.add(getJList(), BorderLayout.WEST);
			jPanel.add(getJScrollPane(), BorderLayout.EAST);
		}
		return jPanel;
	}

	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
			jScrollPane.setViewportView(getJTable());
		}
		return jScrollPane;
	}

	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable();
			jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	                jTable.setRowSorter(sorter);   
	                sorter.setModel(tabModel);
			jTable.setPreferredScrollableViewportSize(new Dimension(600,480));
			jTable.setModel(tabModel);
		}
		return jTable;
	}

	private JList getJList() {
		if (jList == null) {
			jList = new JList();
			jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			jList.setModel(listModel);
		}
		return jList;
	}

Danke & Gruß
 
Hi,

ich finde diesen Teil besonders ungünstig:

Java:
jPanel.setLayout(new FlowLayout());
jPanel.setName("");
jPanel.add(getJList(), BorderLayout.WEST);
jPanel.add(getJScrollPane(), BorderLayout.EAST);

ich würde (wenn auch etwas mehr Code erzeugenderweise ;) ) das GridBagLayout nehmen und dann in der getJPanel() wie folgt vorgehen:

Java:
jPanel.setLayout(new GridBagLayout());

GridBagConstraints listConstraints = new GridBagConstraints();
listConstraints.fill = GridBagConstraints.VERTICAL;
listConstraints.weighty = 1;

jPanel.add(getJList(), listConstraints);

GridBagConstraints tableConstraints = new GridBagConstraints();
tableConstraints.fill = GridBagConstraints.BOTH;
tableConstraints.weightx = 1;
tableConstraints.weighty = 1;

jPanel.add(getJScrollPane(), tableConstraints);

Wahrscheinlich kann man das Ganze auch mit einem anderen Layout erreichen und dabei einige Zeilen sparen, aber das GridBagLayout ist so schön sprechend.


Viele Grüße
Carron
 
Vielen Dank Carron. Genau so habe ich mir das vorgestellt.

Allerdings fehlt mir nach wie vor die Möglichkeit, die JList zu scrollen. Wie HonniCilest schon reklamiert hat, habe ich mich da ein wenig unverständlich ausgedrückt. Mit "gemeinsam" war gemeint, dass JList und JTable scrollbar sind.

Jemand einen Vorschlag?
 
Ähm, soweit ich sehe hast du ja nur ein JScrollPane (getJScrollPane()), und eins kann nur einen ViewPort enthalten. Du brauchst für jeden Komponenten ein eigenes.

Und du solltest das (und natürlich alles, was genauso funktioniert) umbedingt syncronisieren:
Java:
if (jScrollPane == null) {
	jScrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
	//...
}
 
Ich Fall vom Glauben ab^^
Meine bisherigen Versuche einfach ein zweites JScrollPane zu implementieren sind daran verunglückt, dass ich den Rückgabewert nicht angepasst habe...

Danke für alle Beiträge.
 
Zurück