[Megoldva:] FlowLayot - nyomógombok rossz megjelenítése

Fórumok

Sziasztok!

Írni szeretnék egy olyan Java programot, amiben több nyomógomb jelenik meg FlowLayout elrendezésben.
Sok gomb esetén szeretném, ha függőlegesen görgető sáv segítségével görgetni lehetne a gombok mezejében.
A mostani állapot esetén az a bajom, hogy a gombok nem jelennek meg úgy, ahogy azt elvárná az ember egy FlowLayout elrendezéstől. A gombok egy vízszintes vonalban jelennek meg, a keret szélén nem törik meg a sor, ahogy szeretném. Ezáltal nem is lehet görgetni függőlegesen.

Az alábbiakban közlöm a forráskódot. Ha van véleményetek, ne rejtsétek el! Kösz.


import java.awt.*;
import javax.swing.*;

public class MyLayout {
    static JFrame myFrame = new JFrame("My Buttons");
    static int num = 10;
    
    public static void main(String[] args) {
        myFrame.setSize(400, 300);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BorderLayout border = new BorderLayout();
        myFrame.setLayout(border);
        JPanel panel = new JPanel();
        FlowLayout flow = new FlowLayout(FlowLayout.LEFT, 8, 8);
        panel.setLayout(flow);
        
        if (num >= 0) {
            for (int i = 0; i < num; i++) {
                try {
                    JButton button = new JButton("Nyomógomb" + (i+1));
                    panel.add(button);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        JScrollPane scroll = new JScrollPane(panel, 
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
                );
        myFrame.add(scroll, BorderLayout.CENTER);
        myFrame.setVisible(true);    }

}

Hozzászólások

Sajnos ebben az esetben is, amikor "beledobom" a panelt egy JScrollPane-be, akkor ugyanaz történik, mint, amit leírtam. Egy sorba kerülnek a gombok, és nincs függőleges görgetési lehetőség.

Korábban nem írtam, de érdekes módon vízszintesen lehet görgetni a panelt, ha a görgető objektumnál beállítom a vízszintes görgetést. A te példádban is, és az én programomban is.

Hello

egy pár dolog hiányzik


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;

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


public class MyLayout {
    static JFrame myFrame = new JFrame("My Buttons");
    static final int NUM = 10;
    
    public static void main(String[] args) {
        myFrame.setSize(300, 110);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container pane = myFrame.getContentPane();
        pane.setLayout(new BorderLayout());
 
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(270,110));
        panel.setLayout(new FlowLayout());
        if (NUM > 0) {
        		for (int i = 0; i < NUM; i++) {
				JButton button = new JButton("Nyomógomb" + (i+1));
				panel.add(button);
			}
        }
        
        JScrollPane scroll = new JScrollPane(panel);
        scroll.setAutoscrolls(true);
        pane.add(scroll, BorderLayout.CENTER);

        myFrame.setVisible(true);   
    }
}

JFrame-nek szokás elkérni a ContentPane-jét és arra felhelyezni a dolgokat. Először jön a ScrollPane és arra dobod fel a panelt, majd megadod a panel (Flow)layout-ját. Ha kész akkor a scrollpane-t feldobod a contentpane-re. Google-n utánanézel "java pane" címszó alatt biztos találsz tutorialt ami elmagyarázza a frame pane modeljét (mivel nem csak egy pane van neki). Amit bemásoltam még nem teljes mivel ahhoz hogy flow "megtörjön" ahhoz bekell "szorítani" az aktuális ablakméretek közé. Tehát nincs teljesen megoldva, de szerintem eltudsz indulni ezen a vonalon.
Érdemes a Jframe-et egy külön class-ba rakni ami a jframe subclass-a.

Remélem valamit tudtam segíteni.

Azért így is van ezzel probléma: A scrollozás nem a panel tartalmától függ, hanem a setPreferredSize-ban megadott méretektől.

Tfh. éppen minden belefér a panelba és nincs scrollbar. A függőleges méreteket változatlanul hagyva lekeskenyítem az ablakot. A tartalom újratördelődik, és a keskenyebb ablakból mostmár alul kilóg. Mégsem jelenik meg a függőleges scrollbar.

Ha a panel helyett egy textareat nézünk, abban a szöveg hasonlóan tördelődik, mint a panelban a gombok. A textareaban levő scrollbar ráadásul "tudja", hogy meddig ér benne a szöveg. Ezt a viselkedést kéne elérni a panellel is.

--
CCC3

Való igaz, nem egyszerű a helyzet.
Jelenleg úgy oldottam meg a problémát, hogy a keretet fix méretűre vettem, és a benne lévő panel függőleges méretét ráhagyással kiszámolom a benne lévő gombok száma alapján, és azt adom meg a setPreferredSize() függvényben. Így azt a viselkedést kapom, amit szeretnék. Tehát minden nyomógomb FlowLayout elrendezésben felkerül a panelre, függőleges görgetősávval görgethető, és minden gomb hozzáférhető 100%-osan.