Выравнивание объектов в ячейках GridBagLayout - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь научиться пользоваться библиотекой графического интерфейса пользователя JAVA Swing.То, что я пытаюсь сделать, это поместить 2 изображения дисков в ряд и 3 изображения принтеров в ряд под ними.Каждый образ диска должен находиться в середине двух изображений принтера.Я (к сожалению) использую GridBagLayout для достижения этой цели.Я пытаюсь построить сетку из 12 столбцов, чтобы каждый принтер занимал 4 и каждый диск 6. Затем я попытался установить привязки объектов на GridBagConstraints.PAGE_END, чтобы изображения находились в нижней средней части ячейки.Независимо от того, что я делаю, я не могу правильно настроить диски, я потратил огромное количество времени, пытаясь это исправить.

Вот моя функция, которая создает объекты:

private void placeIcon(Container pane, GridBagConstraints c, int x, int y, String imagePath,
                               String imageLabel, int gridWidth) {
    BufferedImage printerIcon;
    try {
        printerIcon = ImageIO.read(new File(imagePath));
    } catch (IOException e) {
        e.printStackTrace();
        return;
    }

    JLabel textLabel = new JLabel(imageLabel + Integer.toString(x + 1),
                                SwingConstants.CENTER);
    JPanel iconPanel = new JPanel();
    iconPanel.setLayout(new GridBagLayout());
    textLabel.setPreferredSize(new Dimension(100,10));

    GridBagConstraints iconConstr = new GridBagConstraints();
    iconConstr.gridx = 0;
    iconConstr.gridy = 0;
    iconConstr.insets = new Insets(10, 3, 1, 3);
    iconConstr.anchor = GridBagConstraints.PAGE_END;
    iconConstr.weightx = 1;
    iconConstr.weighty = 1;
    iconPanel.add(textLabel, iconConstr);

    JLabel iconLabel = new JLabel(new ImageIcon(printerIcon));
    iconLabel.setPreferredSize(new Dimension(250,250));
    iconConstr.gridx = 0;
    iconConstr.gridy = 1;
    iconConstr.insets = new Insets(1, 3, 1, 3);
    iconConstr.anchor = GridBagConstraints.PAGE_END;
    iconConstr.weightx = 1;
    iconConstr.weighty = 1;
    iconPanel.add(iconLabel, iconConstr);

    c.gridx = x;
    c.gridy = y;
    c.weightx = 1;
    c.weighty = 1;
    c.anchor = GridBagConstraints.PAGE_END;
    c.gridwidth = gridWidth;
    c.insets = new Insets(25, 10, 1, 10);
    pane.add(iconPanel, c);
}

Вызывая это так, чтобы создать образы принтера и диска:

    private void placeAllPrinterIcons(Container pane, GridBagConstraints c, int yPos) {
    String imgPath = "bin/images/printer_icon.png";
    String label = "Printer ";
    placeIcon(pane, c, 0, yPos, imgPath, label, 4);
    placeIcon(pane, c, 4, yPos, imgPath, label, 4);
    placeIcon(pane, c, 8, yPos, imgPath, label, 4);
}

private void placeAllDiskIcons(Container pane, GridBagConstraints c, int yPos) {
    String imgPath = "bin/images/disk_icon.png";
    String label = "Disk ";
    placeIcon(pane, c, 0, yPos, imgPath, label, 6);
    placeIcon(pane, c, 6, yPos, imgPath, label, 6);
}

        Container pane = getContentPane();
    pane.setLayout(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;

    placeAllDiskIcons(pane, c, 0);
    placeAllPrinterIcons(pane, c, 1);

Текущий графический интерфейс выглядит такэто, метки должны быть исправлены: First disk not aligned properly

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Попробуйте макет мешка сетки следующим образом (клей Box.createGlue())

enter image description here

0 голосов
/ 05 декабря 2018

Я пытаюсь построить сетку из 12 столбцов, чтобы каждый принтер занимал 4 и каждый диск 6.

К сожалению, вы не можете этого сделать.Вы не можете просто составить столбцы.Менеджер по расположению не знает, что означает столбец, если в каждом столбце нет компонента.

Таким образом, ваше решение - это вложение панелей с различными менеджерами по расположению.

Одним из подходов может быть использование чего-либокак:

JPanel diskPanel = new JPanel( new GridLayout(1, 0) );
diskPanel.add(disk1);
diskPanel.add(disk2);

JPanel printerPanel( new JPanel( new GridLayout(1, 0) );
printerPanel.add(printer1);
printerPanel.add(printer2);
printerPanel.add(printer3);

JPanel mainPanel = new JPanel( new GridLayout(0, 1) );
mainPanel.add(diskPanel);
mainPanel.add(printerPanel);

Это создаст сетки разных размеров.Затем вы добавляете основную панель в свой фрейм.

Примечание: если вы действительно хотите использовать концепцию, состоящую из 12 столбцов, то вам нужно иметь ряд из 12 невидимых компонентов, чтобы занимать каждый столбец.Для примера такого подхода проверьте: Почему этот GridBagLayout не отображается, как запланировано?

...