[GUI][Layouts] Pionowe ułożenie przycisków bez skalowania wertykalnego

[GUI][Layouts] Pionowe ułożenie przycisków bez skalowania wertykalnego
LN
  • Rejestracja:około 16 lat
  • Ostatnio:około rok
  • Postów:1398
0

Witajcie,

Mam prośbę o nakierowanie mnie na sposób rozwiązania mojego problemu. Otóż mam sobie JPanel o ustalonej szerokości i zmiennej wysokości. Na tym JPanelu chcę umieścić ileś JButtonów ale w taki sposób, żeby były one rozmieszczne kolejno od góry JPanelu, ich szerokość była dopasowana do szerokości JPanelu (bez względu na zawartość JButtona - najlepiej jeszcze, żeby tekst na JButtonie się "łamał" do następnej linii, jeśli jest za długi, ale "takie rzeczy, to tylko w Erze" chyba ;) ) oraz żeby (co najważniejsze) wysokość JButtonów nie była zmieniana podczas zmian wysokości JPanelu. To znaczy - może być zmieniana, ale tylko w pewnych granicach. Mam nadzieje, że mnie zrozumieliście ;)

Podsumowanie:

  • buttony na panelu
  • buttony umieszczane kolejno od gory
  • buttony szerokoscia dopasowane do panelu
  • buttony nieskalowalne jesli chodzi o wysokosc (lub skalowalne w okreslonych granicach)

Ascii-art:

| button 1 |

| button 2 |

| button 3 |

| |
| |
| |
| /* reszta |
| panelu */ |
| |

Z góry dzięki za wskazowki.

Btw - tak, sprawdzalem w Googlu, ale zaden ze znalezionych przeze mnie Layoutow mi nie odpowiada. Najlepszy (jak do tej pory) jest GridLayout z 12-oma wierszami i jedna kolumna, z czego na buttony wykorzystuje tylko 3-4 wiersze, a reszta "pustych" wierszy robi za to, co na ascii-artcie jest nazwane "reszta panelu". Ale niestety GridLayout powoduje automatyczne skalowanie wysokosci buttonow przy skalowaniu panelu. A tego nie chce w ogole (lub z okresleniem minimalnej/maksymalnej wysokosci buttonow).

Dzieki !

edytowany 1x, ostatnio: [losowa nazwa]
LN
heh... z mojego Ascii-art'a zrobila sie jakas pseudo-tabelka ;p
0

Napisałem kiedyś na własne potrzeby VerticalLayout, który chyba by Cię zadowolił. Daj znać czy jesteś zainteresowany (z nieznanych mi powodów nie działa w apletach).

LN
Z chęcią przejrzę Twój kod - jeśli możesz, to podeślij/wklej. Na szczęście nie muszę robić żadnych apletów ;]
lipkerson
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

hmm...kiedyś widziałem coś mniej wiecej co Ty chcesz wykorzystującego:

http://www.miglayout.com/

Szukałem na szybko ale już nie znalazłem tego kiedyś, za to na tej stronce zajrzyj do Callback Dock Demo. Oczywiście wytnij ten bajer z powiększaniem i skakaniem i tymi bzdurami;zostaną Ci przyciski równo rozłożone o stałej szerokosci,wysokosci odporne na resize frame'a/panelu.


Another jam from the world for the jam from the voices of the world......
LN
tamże -> Swing Demo -> Cell alignments -> [fill, center] ---> to chyba o to mi chodzi ;)
lipkerson
ano - ten fill to ciekawa rzecz. W aligments -> fill widać ładnie
lipkerson
W ogóle czytałem listę 25 rzeczy które wg programistów mają być dodane do standardu javy i ten miglayout jest na trzecim miejscu. Zaczynam się nim interesować bo co sobie wymysliłem do ćwiczeń to mogę w nim realizować bez konieczności wracania do tych podstawowych.
A7
  • Rejestracja:ponad 14 lat
  • Ostatnio:4 miesiące
0

Ja miałem też niedawno problem z przyciskami w GridLayout (akurat nie z rozmieszczeniem pionowym, ale właśnie wkurzała mnie automatyczna zmiana rozmiaru przycisków) i zrobiłem to tak:
-tworzyłem przycisk
-tworzyłem panel
-dodawałem przycisk do panelu
-dodawałem panel z przyciskiem do "komórki" w gridlayout
To powodowało to, że przy zmianie rozmiarów okna nie zmienia się rozmiarów przycisków, tylko paneli poumieszczanych w gridlayout.
P.S. Na moją propozycję weź małą poprawkę, że jestem bardzo początkujący w Javie, więc może ona się okazać dosyć głupia. :)

OG
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 14 lat
  • Postów:14
0

Mój ulubiony layout to GroupLayout, jeszcze nigdy mnie nie zawiódł.
http://download.oracle.com/javase/tutorial/uiswing/layout/group.html

LN
  • Rejestracja:około 16 lat
  • Ostatnio:około rok
  • Postów:1398
0

MigLayout podziałał, choć trochę mi zajęło obczajenie, jak się nim steruje... ale musiałem jeszcze w innym miejscu go użyć -> ten panel z przyciskami wyśrodkowany pomiędzy dwoma innymi komponentami (umieszczenie w poziomie) - udało się, lecz z niewiadomych powodów prawy komponent jest szerszy o ok 20 px (a nie powinien - patrząc po constraintach, które umieściłem w instancji MigLayouta).

@OgrodnikGordon: Dzięki, sprawdzę go :)
@Arctor75: To tez jest jakies wyjscie :D Niestety tworzenie GUI w Javie jest dosc toporne, wiec jesli to rozwiazanie działa, to czemu by go nie stosowac ? ;)

lipkerson
20 pikseli mówisz - a to mam pytanie czy całość korzysta moze z DardLayout?
LN
@lipkserson: Nie, nie używam takiego LayoutManagera. Sytuacja wygląda tak, że musiałem mieć w okienku następujące kontrolki: - wertykalny JSplitPane - w górnej jego części (kolejno od lewej) rozszerzony JPanel (własna kontrolka zawierająca w sobie inne), JPanel z przyciskami (ten "nieszczęsny") (miał być po środku okna) i drugi analogiczny rozszerzony JPanel (i te wszystkie trzy komponeny leżały na JPanelu) c.d.n
LN
c.d: (ograniczona długość) - w dolnej częsci też coś mialo byc, ale to nieistotne Wcześniej w górnej części ten JPanel ("główny") miał BoxLayout z argumentem LINE (czyli ulozenie poziome) i panel z przyciskami mial sztywne ograniczenia na rozmiar (szerokosc) - to zapewnialo, ze byl w srodku okna - gdy dalem MigLayout na ten panel z przyciskami,to ten zewnetrzny BoxLayout zaczal wariowac ;p To znaczy, gdy probowalem przyciski dac u gory ("aligny top"), to panel z przyciskami byl wyrownywany przez ten BoxLayout do dolu - c.d.n.
LN
- czyli de facto przyciski byly po srodku okna (w pionie) a nie u gory, analogicznie, gdy probowalem przyciski przeniesc na dol, to panel wedrowal na gore... - wiec BoxLayout zmienilem tez na MigLayout i jego argumenty dla kolumn to cos w stylu "[grow, fill][][grow, fill]" a dla panelu z przyciskami dalem cos w stylu "width 160!" (czyli rozmiar na sztywno ustawiony) - i dziala, ale panel z przyciskami jest przesuniety o jakies 20 px w lewo (za duzy prawy Panel (ten własny))
0

Jest tak krótki, że mogę chyba wkleić.

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

public class VerticalLayout implements LayoutManager
{
    private int pad;
    private int preferredWidth;
    private int width;
    private int verticalMargins;
    //------------------------
    public VerticalLayout(int width,int pad,int margins)
    {
        this.pad=pad;
        preferredWidth=width;
        verticalMargins=margins;
    }
    //------------------------
    public VerticalLayout(int width,int pad)
    {
        this(width,pad,0);
    }
    //------------------------
    public VerticalLayout(int width)
    {
        this(width,0,0);
    }
    //------------------------
    public void addLayoutComponent(String name,Component c)
    {
    }
    //------------------------
    public void removeLayoutComponent(Component c)
    {
    }
    //------------------------
    public Dimension preferredLayoutSize(Container parent)
    {
        return computeSize(parent,pad);
    }
    //------------------------
    public Dimension minimumLayoutSize(Container parent)
    {
        return computeSize(parent,0);
    }
    //------------------------
    public void layoutContainer(Container parent)
    {
        Component[] komponenty=parent.getComponents();
        Insets in=parent.getInsets();
        int y=in.top+verticalMargins/2;
        for (int i=0;i<komponenty.length;i++)
        {
            Component k=komponenty[i];
            Dimension d=k.getPreferredSize();
            Rectangle r=new Rectangle(in.left,y,width-(in.left+in.right),d.height);
            y+=(d.height+pad);
            k.setBounds(r);
        }
    }
    //------------------------
    protected Dimension computeSize(Container parent,int pad)
    {
        Component[] komponenty=parent.getComponents();
        Dimension d;
        Insets in=parent.getInsets();
        width=preferredWidth+in.left+in.right;
        int height=in.top+in.bottom+verticalMargins;
        for (int i=0;i<komponenty.length;i++)
        {
            Component k=komponenty[i];
            d=k.getPreferredSize();
            width=Math.max(width,d.width+in.left+in.right);
            height+=(d.height+pad);
        }
        return new Dimension(width,height);
    }
}

lipkerson
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

Grouplayout w netbeans to FreeDesign? Coś kojarze, że w netbeans gui builder FreeDesign jest mieszanką GroupLayout i czegoś jeszcze dostępnego tylko w netbeans (jakaś niskopoziomowa optymalizacja czy coś). Da się w netbeans uzyskać "czysty" GroupDesign? W liście go nie widać...

BTW FreeDesign ma niby opcje dzielenia obaszarów na poziome i pionowe części oraz dobieranie aligmentów dla komponentów w danej już podzielonej części. o Ile umiem to rozpisać sobie bez użycia gui builder, to nie umiem tych opcji wyszukać własnie w tym netbeansowych designerze...ktoś próbował?


Another jam from the world for the jam from the voices of the world......

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.