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

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 !

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).

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.

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. :)

0

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

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 ? ;)

0

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

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);
    }
}

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ł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1