2012-01-12 12 views
7

Nie mogę znaleźć sposobu na zmianę rozmiaru niektórych elementów w GUI swing. Niektóre etykiety niestandardowe są dodawane do FlowLayout, które nie zachowują się tak, jak powinny podczas zmiany rozmiaru okna dialogowego. Panel jest tworzony przy użyciu frameworka formularzy jgoodies.Uzyskaj preferowany rozmiar wielowierszowego szablonu prezentacji

przy użyciu tego, gdzie FlowLayout jest dodawana do xy (3, y)

FormLayout layout = new FormLayout("r:d, 5px, f:d:g", // columns 
      "p, p, 5px, p, 5px, p") // rows 

FlowLayout rozszerza się pasek przewijania pojawia się
tags_scroll

przypadku korzystania

FormLayout layout = new FormLayout("r:d, 5px, f:10:g", // columns 
      "p, p, 5px, p, 5px, p") // rows 

FlowLayout używa dostępnego miejsca i elementy z drugiej linii znikają
tags_vanish

Chciałbym powiększyć wysokość każdego wiersza zawierającego FlowLayout do aktualnej wysokości komponentu. Niestety preferowany rozmiar zawsze odpowiada wysokości pojedynczego rzędu.
Czy inny układ byłby bardziej odpowiedni? Pogrubiony tekst po lewej powinien być wyrównany do prawej, a następnie FlowLayout.

Sources

[edytuj] Po próbowali dowiedzieć się, jak to zrobić na wiele tygodni, rzeczywista kwestia może być wznowione do tego:
Zestaw etykiet jest dodawana do JPanel. Ten JPanel powinien wykorzystywać całą dostępną przestrzeń w poziomie (rozmiar dialogu minus szerokość etykiety znacznika) i rozwijać w razie potrzeby w pionie. Jeśli wysokość JPanela staje się większa niż dialog, powinien pojawić się pionowy pasek przewijania (poziomy pasek przewijania nigdy nie jest widoczny). Dialog może pokazywać wiele JPaneli, które będą wyświetlane jeden po drugim (pionowo).

Oto próba korzystania GridBagLayout i WrapLayout:

public class GridBagLayoutTagPanel extends JPanel { 
private static final long serialVersionUID = -441746014057882848L; 
private final int NB_TAGS = 5; 

public GridBagLayoutTagPanel() { 
    setLayout(new GridLayout()); 

    JPanel pTags = new JPanel(new GridBagLayout()); 
    pTags.setBackground(Color.ORANGE); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipadx = 5; 
    c.ipady = 5; 

    int rowIndex = 0; 
    for (int i = 0; i < NB_TAGS; i++) { 
     //add tag name 
     JLabel lTagName = new JLabel(String.format("Tag %s:", i)); 
     lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD)); 
     c.fill = GridBagConstraints.NONE; 
     c.gridx = 0; 
     c.gridy = rowIndex++; 
     pTags.add(lTagName, c); 

     //add tag values 
     JPanel pTag = new JPanel(new BorderLayout()); 
     pTag.add(new JLabel("+"), BorderLayout.LINE_START); //label used to add new tags 
     pTag.add(getWrapPanel(), BorderLayout.CENTER); //the list of tag values 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     pTags.add(pTag, c); 
    } 

    //JScrollPane sp = new JScrollPane(pTags); 
    //sp.setBorder(BorderFactory.createEmptyBorder()); 

    add(pTags); 
    } 

private static JPanel getWrapPanel() { 
    JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0)); 

    for (int i = 0; i < 50; i++) { 
      p.add(new JLabel("t" + i)); 
    } 
    return p; 
} 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.getContentPane().add(new GridBagLayoutTagPanel()); 
    f.setSize(new Dimension(500, 300)); 
    f.setVisible(true); 
} 
} 
+0

miłe pytanie +1 – mKorbel

+0

Czy próbowałeś za pomocą 'FormDebugUtils' klasę i/lub' FormDebugPanel'? Te narzędzia do debugowania pomogły mi kilka razy, aby zobaczyć, co się dzieje. – Robin

+0

Dlaczego podajesz słowo "FlowLayout", gdy kod wyraźnie wskazuje, że używane jest 'FormLayout'? 'FormLayout! = FlowLayout'. –

Odpowiedz

3

Z pomocą Roba i korzystania z jego WrapPanel i ScrollablePanel teraz działa dokładnie tak jak powinien

public class GridBagLayoutTagPanel extends JPanel { 
    private final int NB_TAGS = 5; 
    private final int NB_TAGVALUES = 50; 

    public GridBagLayoutTagPanel() { 
    setLayout(new GridLayout()); 

    ScrollablePanel pTags = new ScrollablePanel(new GridBagLayout()); 
    pTags.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 
    pTags.setBackground(Color.ORANGE); 
    GridBagConstraints c = new GridBagConstraints(); 
    c.ipadx = 5; 
    c.ipady = 5; 

    int rowIndex = 0; 
    for (int i = 0; i < NB_TAGS; i++) { 
     // add tag name 
     JLabel lTagName = new JLabel(String.format("Tag %s:", i)); 
     lTagName.setFont(lTagName.getFont().deriveFont(Font.BOLD)); 
     c.fill = GridBagConstraints.NONE; 
     c.gridx = 0; 
     c.gridy = rowIndex++; 
     c.weightx = 0; // keep minimum size of the cell containing the label when resizing 
     c.weighty = 0; 
     pTags.add(lTagName, c); 

     // add tag values 
     JPanel pTag = new JPanel(new BorderLayout()); 
     pTag.add(new JLabel("+"), BorderLayout.LINE_START); // label used to add new tags 
     pTag.add(getWrapPanel(), BorderLayout.CENTER); // the list of tag values 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 1; 
     c.weightx = 1; // fill horizontally 
     c.weighty = 1; 
     pTags.add(pTag, c); 
    } 

    JScrollPane sp = new JScrollPane(pTags); 
    sp.setBorder(BorderFactory.createEmptyBorder()); 

    add(sp); 
    } 

    private JPanel getWrapPanel() { 
    JPanel p = new JPanel(new WrapLayout(FlowLayout.LEFT, 5, 0)); 

    for (int i = 0; i < NB_TAGVALUES; i++) { 
     p.add(new JLabel("t" + i)); 
    } 

    p.setSize(400, 1); 
    return p; 
    } 

    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    f.getContentPane().add(new GridBagLayoutTagPanel()); 
    f.setSize(new Dimension(500, 300)); 
    f.setVisible(true); 
    } 
} 
11

Chciałbym poszerzyć wysokość każdego wiersza zawierającego FlowLayout do aktualnej wysokości składnika. Niestety preferowany rozmiar zawsze odpowiada wysokości pojedynczego rzędu.

Wrap Layout obsługuje to.

+0

To jest dokładnie to, czego szukam. Zaznaczę wpis jako odpowiedź, gdy będę mógł go przetestować. Jestem zaskoczony, że żaden standardowy menedżer układu nie zachowuje się tak, ponieważ wydaje się dość powszechnym przypadkiem użycia. – Philippe

+0

Próbowałem od dwóch tygodni, aby to zadziałało bez powodzenia. Z każdym menedżerem układu pojawiały się różne problemy. Używając jgoodies FormLayout, rozmiar komponentu wynosi 0, gdy jest potrzebny do obliczenia wysokości i szerokości. Z GridBagLayout zmiana rozmiaru nie zachowuje się dobrze (dostajemy przykład, jeśli ktoś chce spojrzeć). Z wersją SpringLayout komponenty zawsze rozszerzają się pionowo za pomocą Springutilities.makeGrid() i powodują wyświetlanie znaczników w pojedynczej linii przy użyciu Springutilities.makecompactGrid(). – Philippe

2

Czy próbowałeś już MigLayout? Jest to jedyny menedżer układu, którego używam i nigdy nie znalazłem układu, którego nie mógłbym zrobić.

Powiązane problemy