GridLayout Справка в Java - PullRequest
       13

GridLayout Справка в Java

3 голосов
/ 10 февраля 2011

У меня есть JPanel со следующим кодом:

JPanel pane = new JPanel();
pane.setLayout(new GridLayout(3, 2, 10, 30));
final JTextField fileName = new JTextField();
pane.add(fileName);
JButton creater = new JButton("Create File");
pane.add(creater);
JButton deleter = new JButton("Delete File");
pane.add(deleter);

Мне было интересно, как мне сделать так, чтобы JTextField занимал два пробела в GridLayout, в то время как две кнопки совместно используют строкузанимая один пробел в каждой строке?

Ответы [ 4 ]

2 голосов
/ 10 февраля 2011

С GridLyout это сложно сделать.Вы создали более широкие ячейки (например, new GridLayout(2, 2, 10, 30), затем добавили TextField в первую ячейку. Затем вам нужно создать еще одну панель с GridLayout (2, 1), поместить ее в ячейку во второй строке и добавить кнопку в 1-ю строку.ячейка этого вложенного расположения сетки.

Вскоре вам нужен GridLayout для других GridLayout.

Есть более эффективные инструменты для реализации этого. Сначала взгляните на GridBagLayout. Просто чтобы убедиться, чтоне всегда пик-ник :).Тогда взгляните на альтернативные решения, такие как MigLayout.Это не часть JDK, но действительно мощный инструмент, который делает вашу жизнь проще.

1 голос
/ 11 февраля 2011

После того, как я перебил предложение сторонних макетов, и поскольку у меня злобная ненависть к ГБЛ, я подумал, что пришло время «поставить свой код там, где я говорю» для общественного контроля (и уничтожения).

Этот SSCCE использует вложенный макет.

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

class SimpleLayoutTest {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                JPanel ui = new JPanel( new BorderLayout(20,20) );
                // I would go for an EmptyBorder here, but the filled
                // border is just to demonstrate where the border starts/ends
                ui.setBorder( new LineBorder(Color.RED,15) );

                // this should be a button that pops a JFileChooser, or perhaps
                // a JTree of the existing file system structure with a JButton
                // to prompt for the name of a new File.
                final JTextField fileName = new JTextField();
                ui.add(fileName, BorderLayout.NORTH);

                JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 10, 30));
                ui.add(buttonPanel, BorderLayout.CENTER);

                JButton creater = new JButton("Create File");
                buttonPanel.add(creater);
                JButton deleter = new JButton("Delete File");
                buttonPanel.add(deleter);

                JOptionPane.showMessageDialog(null, ui);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}
1 голос
/ 10 февраля 2011

Вы не можете выполнять интервалы столбцов с GridLayout. Я рекомендую вам попробовать GridBagLayout и GridBagConstraints

0 голосов
/ 10 февраля 2011

Посмотрите учебник по Как использовать GridBagLayout .

Пример кода:

    JPanel pane = new JPanel();
    GridBagLayout gridbag  = new GridBagLayout();
    pane.setLayout(gridbag);
    GridBagConstraints c = new GridBagConstraints();

    final JTextField fileName = new JTextField();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridwidth = 2;
    c.gridx = 0;
    c.gridy = 0;
    pane.add(fileName, c);

    JButton creater = new JButton("Create File");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridwidth = 1;
    c.gridx = 0;
    c.gridy = 1;
    pane.add(creater, c);

    JButton deleter = new JButton("Delete File");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    pane.add(deleter, c);
...