Алтернатива на абсолютното оформление?

Има ли мениджър на оформлението, който дава същата степен на контрол като Absolute Позициониране? Но също така прави възможно автоматичното преоразмеряване? Нещо, където можете да поставите елементи, използвайки относителни координати?


person user1633277    schedule 16.05.2013    source източник
comment
никога да не използвате само един LayoutManager за цялото приложение, няма алтернатива на Nested Layout, не истински LayoutManager, но относно логиката за разделяне на един контейнер на няколко контейнера с различни, но със същия LayoutManager също   -  person mKorbel    schedule 16.05.2013


Отговори (3)


GridBagLayout е най-гъвкавият стандартен мениджър на оформление в Swing и може постигнете практически всичко, от което се нуждаете, макар и далеч не толкова просто, колкото си представяте, като използвате само относителни координати (това, което имате предвид, предполагам, е 0-100% спрямо размера на рамката).

Можете да намерите официалната документация за GridBagLayout тук , който също има някои цифри и примери.

Можете също да разгледате MiG Layout с отворен код, който е много по-удобен че GridBagLayout и също малко по-мощен. Това е майката на всички мениджъри на оформление.

person Community    schedule 16.05.2013
comment
GridBagLayout използване и пример могат да бъдат намерени тук. - person afsantos; 16.05.2013

Най-мощният мениджър на оформление в JDK е GridBagLayout. Типичният потребителски интерфейс обаче съдържа композиция от панели, всеки от тях е конфигуриран да използва различно оформление. Например оформление на граници за цял прозорец, оформление на потока за панел, който съдържа набор от бутони, GridLayout или GridBagLayout за сложни части.

Можете също така да разгледате алтернативи като MigLayout - много мощен инструмент, който позволява създаване на почти всеки изглед, който можете да си представите.

person AlexR    schedule 16.05.2013

Друг вариант е да използвате SpringLayout (лично аз харесвам GridBagLayout).

въведете описание на изображението тук

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.SpringLayout.*;

public class SpringScaleTest {
  public JComponent makeUI() {
    SpringLayout layout = new SpringLayout();
    JPanel p = new JPanel(layout);
    p.setBorder(BorderFactory.createLineBorder(Color.GREEN, 10));

    JLabel  l1 = new JLabel("label: width=90%", SwingConstants.CENTER);
    l1.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
    JButton l2 = new JButton("button: width=50%");

    Spring panelw = layout.getConstraint(WIDTH, p);

    SpringLayout.Constraints c1 = layout.getConstraints(l1);
    c1.setX(Spring.constant(0));
    c1.setY(Spring.constant(20));
    c1.setWidth(Spring.scale(panelw, 0.9f));
    p.add(l1);

    SpringLayout.Constraints c2 = layout.getConstraints(l2);
    c2.setWidth(Spring.scale(panelw, 0.5f));
    layout.putConstraint(SOUTH, l2, -20, SOUTH, p);
    layout.putConstraint(EAST,  l2, -20, EAST,  p);
    p.add(l2);

    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() { createAndShowGUI(); }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new SpringScaleTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
person aterai    schedule 17.05.2013