2015-10-05 2 views
0

Я пытался использовать GridBagLayout для организации группы панелей (содержащих кучу меток, которые изменяют размер панели, в основном вертикально). Основная причина, по которой я выбрал это, состоит в том, что размеры панели могут отличаться друг от друга, и я хотел бы, чтобы панели масштабировались при изменении размера кадра.Организовать панели динамического размера в формате таблицы (Java SWING)

Я постоянно сталкиваюсь с проблемами, начиная от панелей разного размера (проверяя границы на панелях), странных вопросов калибровки, не может заставить панели придерживаться друг друга вертикально (массивное пространство между панелями).

Gridbag казался лучшим вариантом, но кажется, что он становится болью больнее, чем я себе представлял. Какие другие параметры обеспечивают правильное масштабирование при изменении размера фрейма?

+2

1) изучите использование менеджера макетов MigLayout, который вам нужно будет загрузить. 2), или если вы хотите, чтобы наша помощь помогла вам оптимизировать GridBagLayout или любые другие макеты, вернитесь сюда с кодом, желательно [mcve] и с изображениями ваших желаемых и наблюдаемых графических интерфейсов. –

+0

Редактировать - Нашли ссылки для скачивания, но не знаете, какой из них скачать, так много версий. –

ответ

3

Я стал фанатом what @SplungeBob showed me давным-давно. Ниже приведен фрагмент кода дает вам представление о том, что нужно для выполнения графического интерфейса, показанного ниже.

frame.add(menu,    new GBConstraints(0, 0).spanX(32).fill(HORIZONTAL)); 
    frame.add(new JLabel("Available letters"), 
           new GBConstraints(0, 1).insets(2, 2, 0, 2)); 
    frame.add(new JLabel("Play by play..."), 
           new GBConstraints(2, 1).insets(0, 5, 0, 0)); 
    frame.add(pnlPlays,   new GBConstraints(2, 1).insets(10, 0, 0, 0).spanY(14).anchor(WEST).fill(BOTH));//.ipad(0,0)); 

    frame.add(pnlAvail,   new GBConstraints(0, 2).insets(0, 5, 5, 5)); 
    frame.add(pnlLegend,  new GBConstraints(1, 2)     .spanY(14)    .fill(BOTH)); 
    frame.add(pnlBonuses,  new GBConstraints(0, 3).insets(0, 100, 0, 0)); 
    frame.add(pnlSBBonuses,  new GBConstraints(0, 3).insets(0, 125, 0, 0)); 
    frame.add(gamePanel,  new GBConstraints(0, 5).insets(0, 50, 0, 0)); 
    frame.add(pnlTheScore,  new GBConstraints(0, 5)        .anchor(EAST)); 
    btnDebug.setPreferredSize(new Dimension(1, 1)); 
    frame.add(btnDebug,   new GBConstraints(0, 0)        .anchor(WEST)); 

    frame.add(btnNextReplayStep,new GBConstraints(0, 6).insets(0,310, 0, 0)   .anchor(CENTER)); 
       btnNextReplayStep.setVisible(false); 
    frame.add(new JLabel("User letters"), 
           new GBConstraints(0, 6).insets(0,240, 30, 0)); 
    frame.add(btnCopyUser,  new GBConstraints(0, 6).insets(0,310,0,0)    .anchor(CENTER)); 

    frame.add(btnCopyAllLetters,new GBConstraints(0, 6)        .anchor(EAST)); 
    frame.add(pnlNotes,   new GBConstraints(0, 6).insets(25,10,10, 10).spanY( 2).anchor(WEST)); 
    frame.add(btnClearMnemHi, new GBConstraints(0, 7).insets(0,430, 0, 0)); 
    frame.add(btnClearBorders, new GBConstraints(0, 7).insets(0,530, 0, 0)); 

enter image description here

я не буду лежать; это может быть важной задачей, но при тщательном планировании с реальной сеткой, помеченной вертикальными и горизонтальными линиями, чтобы показать, например, сколько столбцов должно быть поле span, стоит попробовать. И шансы превосходны, что то, что предлагает @Hovercraft, еще лучше.

(я не осилил его, кажется, как странные insets значения, кажется, указывают. Но это симпатичный надежный GUI.)

EDIT

Вот код для того, как два Объекты JPanel были созданы до выполнения вышеуказанного кода. Также используется GridBagLayout; другой нет. Только то, что работает проще всего и лучше.

private void makePlays(){ 
    pnlPlays = new JPanel(new GridBagLayout()); 
    pnlPlays.setSize(500,300); 
    pnlPlays.add(scrPlays, new GBConstraints(0,1).span(40, 62) 
               .fill(BOTH).ipad(100, 50)); 
    scrPlays.setEnabled(false); 
    } 

    private void makeScoremasterBonuses(){ 
    BonusBackgroundColors c; 
    BonusBackgroundColors all [] = BonusBackgroundColors.values(); 
    String labels[] = new String[all.length]; 
    String abbrs [] = new String[all.length]; 

    JButton but; 
    pnlBonuses = new JPanel(); 
    pnlBonuses.add(new JLabel("Legend:")); 

    for (int i = 0; i < all.length; i++) { 
     labels[i] = all[i].name().replace("_", " ").toLowerCase(); 
     abbrs [i] = Utilities.abbreviate(all[i].name()); 
     c = BonusBackgroundColors.values()[i]; 
     but = new JButton(abbrs[i]); 
     but.setToolTipText(labels[i]); 
     but.setBackground(c.background(c)); 
     but.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     but.setActionCommand("" + i); 
     but.addActionListener(this); 
     pnlBonuses.add(but); 
    } 
    } 
Смежные вопросы