Swing JScrollPane/Layoutmanger Problem bei dynamischer Größenänderung

guarditan

Mitglied
Hallo :),

ich kämpfe in letzter Zeit mit einem Problem. Ich will nämlich mir ein Fenster erstellen, dass aus beliebig vielen Buttons besteht. Ich habe mir das momentan so gedacht, dass ich das Fenster mit nem GridBaglayout gestalte. In die erste Zeile kommen zwei Buttons und eine Combobox. In die zweite Zeile kommt das JScrollPane. Diesem wird ein JPanel übergeben, welches die ganzen Buttons verwalten soll. Das funktioniert alles soweit prima, solang die Buttons "ohne scrollen" darstellbar sind. Sobald es zu viele werden, bekomme ich keine gescheite Anzeige mehr hin. Ich fürchte irgendwie, dass der Layoutmanger dran Schuld sein könnte, bin mir aber nicht sicher. Habe da auch schon mehrere versucht von Grid, GridBag, Null, usw.

Habt ihr da ne Idee oder wie würdet ihr das am besten lösen ?

Problem ist ja ganz einfach. Ganz viele Buttons auf dem Fenster mit fester Größe. Zudem halt Scrollbalken damit auch alle Buttons erreichbar sind.
 

guarditan

Mitglied
Ich habe mal versucht mein Beispiel möglichst klein zu halten. Aber so sollte es Problemlos compilieren. Die Variable count (zeile 99/100) zeigt die quadratische Anzahl an Buttons. Bei 12 funktioniert sie prima, bei 32 nicht mehr. Ich hoffe das hilft :)


Java:
import javax.swing.JFrame;
import java.awt.Adjustable;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.border.Border;
import javax.swing.tree.DefaultMutableTreeNode;


 
class test extends JFrame
{ 
	
	public static void main(String[] args){
		test t = new test();
		t.genWindowNewGrid();
		
	}
	
			
	public test(){
			
			this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
			this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
		    this.setResizable(false);
		    this.setUndecorated(false);
		    
		}
		
		
		private GridBagConstraints setCons(int x, int y, int gx, int gy, double wx, double wy){
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = x;
		    gbc.gridy = y;
		    gbc.gridwidth = gx;
		    gbc.gridheight = gy;
		    gbc.weightx = wx;
		    gbc.weighty = wy;
		    gbc.insets = new Insets(1,1,1,1);
		    //gbc.anchor = GridBagConstraints.CENTER;
		    return gbc;
		}
		
	private void genWindowNewGrid(){
		
		this.getContentPane().removeAll();
		
		GridBagLayout gbl = new GridBagLayout();
		this.setLayout(gbl);
		GridBagConstraints gbc = new GridBagConstraints();
		
		String[] jcomboContent = {"right","down","column","row"};
		JComboBox jcombo = new JComboBox(jcomboContent);
		gbc = setCons(0,0,1,1,0,0);
	    this.add(jcombo);
	    gbl.setConstraints(jcombo, gbc);
	    
	    JButton jBtnSave = new JButton("save");
	    gbc = setCons(1,0,1,1,0,0);
	    this.add(jBtnSave);
	    gbl.setConstraints(jBtnSave, gbc);
	    
	    JButton jBtnBack = new JButton("back");
	    gbc = setCons(2,0,1,1,0,0);
	    this.add(jBtnBack);
	    gbl.setConstraints(jBtnBack, gbc);
			
			
		GridBagLayout gbl2 = new GridBagLayout();
		JPanel jPanelGrid = new JPanel();
		//jPanelGrid.setLayout(gbl2);
		//jPanelGrid.setLayout(null);
		
		int count=12;
		//int count=32;
		
		jPanelGrid.setLayout(new GridLayout(count,count));
		
		JButton[] but = new JButton[count*count];
		
		for(int i=0;i<but.length;i++){
			but[i] = new JButton(String.valueOf(i));
			//but[i].setBounds(10*i, 10*i, 10, 10);
			but[i].setSize(10, 10);
			jPanelGrid.add(but[i]);
			
		}
		
		
				
		JScrollPane jScrollPaneGrid = new JScrollPane(jPanelGrid,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		gbc = setCons(0,1,3,1,0,1);
	    this.add(jScrollPaneGrid);
	    gbl.setConstraints(jScrollPaneGrid, gbc);
		
			
		this.setVisible(true);
	    
	    this.repaint();
	    

	}

	private String rekAlpha(double d){
		if(d/26>1){
			return rekAlpha(d/26) + (char)((d-1)%26+65);
		}
		return String.valueOf((char)((d-1)%26+65));
	}

		
  
}
 

André Uhres

Top Contributor
Hallo guarditan,

versuch's mal so:

Java:
import java.awt.*;
import static java.awt.GridBagConstraints.*;
import javax.swing.*;

class Test extends JFrame {

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                Test t = new Test();
                t.genWindowNewGrid();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }

    public Test() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
        Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
        this.setBounds(screenInsets.left, screenInsets.top,
                screensize.width - screenInsets.left - screenInsets.right,
                screensize.height - screenInsets.top - screenInsets.bottom);
        this.setResizable(false);
        this.setUndecorated(false);
    }

    private GridBagConstraints setCons(int x, int y, int gx, int gy, double wx, double wy, int fill) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = gx;
        gbc.gridheight = gy;
        gbc.weightx = wx;
        gbc.weighty = wy;
        gbc.insets = new Insets(1, 1, 1, 1);
        gbc.fill = fill;
        return gbc;
    }

    private void genWindowNewGrid() {
        this.getContentPane().removeAll();
        this.setLayout(new GridBagLayout());
        String[] jcomboContent = {"right", "down", "column", "row"};
        JComboBox jcombo = new JComboBox(jcomboContent);
        this.add(jcombo, setCons(0, 0, 1, 1, 0, 0, NONE));
        JButton jBtnSave = new JButton("save");
        this.add(jBtnSave, setCons(1, 0, 1, 1, 0, 0, NONE));
        JButton jBtnBack = new JButton("back");
        this.add(jBtnBack, setCons(2, 0, 1, 1, 0, 0, NONE));
        JPanel jPanelGrid = new JPanel();
        int count = 32;
        jPanelGrid.setLayout(new GridBagLayout());
        JButton[] but = new JButton[count * count];
        int i = 0;
        for (int row = 0; row < count; row++) {
            for (int column = 0; column < count; column++) {
                but[i] = new JButton(String.valueOf(i));
                jPanelGrid.add(but[i], setCons(column, row, 1, 1, 0, 0, BOTH));
                i++;
            }
        }
        jPanelGrid.revalidate();
        JScrollPane jScrollPaneGrid = new JScrollPane(jPanelGrid,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPaneGrid.setPreferredSize(new Dimension(702, 354));
        this.add(jScrollPaneGrid, setCons(0, 1, 3, 1, 1, 1, NONE));
        this.setVisible(true);
        this.repaint();
    }
}

Gruß,
André
 

Paeddah

Mitglied
Hi!

Ich hatte jetzt nur kurz reingeschaut und gesehen, dass du die PreferredSize bzw. MinimumSize nicht gesetzt hast.


Dieser Artikel Wie das GridBagLayout die Komponenten anordnet lässt mich vermuten folgendes vermuten:

Sobald der aktuelle Inhalt nicht mehr vollständig angezeigt werden kann - also die ScrollBars angezeigt werden müssen / aktiviert werden müssen - verwendet der LayoutManager die Preferred bzw. MinimumSize um die Größe des ScrollPane-Containers zu bestimmen.

Die ist aber - standardmäßig? - auf 22 X 22 eingestellt.

Hoffe das war a) soweit korrekt und b) es hilft

Grüße

Päddah
 

André Uhres

Top Contributor
Hallo Päddah,

im vorliegenden Fall braucht man nur die PreferredSize vom jScrollPaneGrid zu setzen. Die PreferredSize vom jPanelGrid ergibt sich aus den impliziten PreferredSizes der JButtons, die dort untergebracht sind (dazu muss man allerdings das GridLayout für jPanelGrid durch GridBagLayout ersetzen).

Die MinimumSize wird hier nicht benutzt, da der Frame nicht resizable ist.

Gruß,
André
 

guarditan

Mitglied
Danke an beide für eure Hilfen. Es funktioniert jetzt und nun kann ich mich endlich wieder dem Programmieren widmen und nicht mehr der Fehlersuche :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
N Swing JScrollPane mit Tastatur bedienen? AWT, Swing, JavaFX & SWT 0
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
MaxG. Swing JScrollPane AWT, Swing, JavaFX & SWT 10
Soloeco Swing JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
Bluedaishi JScrollpane AWT, Swing, JavaFX & SWT 0
L JScrollPane scrollt nicht !! AWT, Swing, JavaFX & SWT 3
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
F JTable mit JScrollPane AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A JScrollPane - ScrollBar Buttongröße verändern AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
A Swing JScrollPane Problem AWT, Swing, JavaFX & SWT 6
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane in JScrollPane - Problem AWT, Swing, JavaFX & SWT 3
K Bug in JScrollPane? AWT, Swing, JavaFX & SWT 4
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
V LayoutManager JScrollPane verwirft Elementanordnung AWT, Swing, JavaFX & SWT 3
B JScrollPane Problem AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane AWT, Swing, JavaFX & SWT 7
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
B JScrollPane Horizontal klappt nicht. AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Swing Korrekte JTable.rowAt(point) für JTable in JScrollPane AWT, Swing, JavaFX & SWT 5
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
S JScrollPane reagiert nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane zu JTable hinzufügen AWT, Swing, JavaFX & SWT 16
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8
P Swing JScrollpane AWT, Swing, JavaFX & SWT 2
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
V Swing JScrollPane Viewport verschieben AWT, Swing, JavaFX & SWT 2
J JScrollPane Probleme AWT, Swing, JavaFX & SWT 3
S Swing JScrollPane verliert Scrollbars AWT, Swing, JavaFX & SWT 5
D Swing JTable in JScrollpane beliebig verbreitern AWT, Swing, JavaFX & SWT 5
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
J Swing Unteren Abstand für JTable in JScrollPane festlegen AWT, Swing, JavaFX & SWT 10
xehpuk Swing Line-wrapping von JTextPane (in JScrollPane) AWT, Swing, JavaFX & SWT 3
M JScrollPane Problem AWT, Swing, JavaFX & SWT 6
S Swing JScrollpane und ViewPort AWT, Swing, JavaFX & SWT 4
D JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 12
X JScrollPane funzt net... AWT, Swing, JavaFX & SWT 5
H jscrollpane AWT, Swing, JavaFX & SWT 12
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
A Problem mit JScrollPane in einer JScrollpane AWT, Swing, JavaFX & SWT 4
B JScrollPane Problem AWT, Swing, JavaFX & SWT 25
T Swing JScrollPane- und Tabelle-Header Problem AWT, Swing, JavaFX & SWT 25
P Swing JScrollPane-Inhalt: Grösse anpassen AWT, Swing, JavaFX & SWT 6
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
A JScrollPane AWT, Swing, JavaFX & SWT 16
C Swing JScrollPane und Scroll-Geschwindigkeit AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben