GridBagLayout: How to Move Specified Components

java swing layout layout-manager gridbaglayout

222 观看

1回复

36 作者的声誉

My goal is to move only the image to the center.
But when I shift the image to the right or left the from label and textfield also get pushed over by the amount I specified for the image.
Is there any way to prevent the label and the textfield from moving while the image is moved?
Here is what I did so far:

// Center

center = new JPanel();
center.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
Border innerC = BorderFactory.createTitledBorder("Travel details");
Border outsideC = BorderFactory.createEmptyBorder(5,5,5,5);
center.setBorder(BorderFactory.createCompoundBorder(outsideC,innerC));

fromLabel = new JLabel("From : ");
fromField = new JTextField("to",30);
fromLabel.setFont(font);  

gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 4.0;
gbc.weighty = 4.0;
gbc.insets = new Insets(5,4,5,5);
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.LINE_END;
center.add(fromLabel,gbc);

gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridwidth = 1;
center.add(fromField,gbc);

JButton trainImage = new JButton();
trainImage.setIcon(new ImageIcon("train.jpg"));

gbc.gridx = 1;
gbc.gridy = 20;
gbc.weightx = 10;
gbc.weighty = 20;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridwidth = 3;
gbc.ipadx = 5;
center.add(trainImage,gbc);

this.add(center, BorderLayout.CENTER);
this.setVisible(true);  

Main method:

public static void main(String[] args) {
    gui g = new gui();
}

enter image description here

作者: irishmaniac 的来源 发布者: 2017 年 12 月 27 日

回应 1


1

154753 作者的声誉

The above code suggests a misunderstanding of how both weightx/y & gridx/ywork. This MCVE corrects the numbers to center the button with image, while leaving the label and text field on the top left.

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

public class CenteredImageInGridBag {

    private JComponent ui = null;

    CenteredImageInGridBag() {
        initUI();
    }

    public final void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        JPanel center = new JPanel();
        ui.add(center);
        center.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        Border innerC = BorderFactory.createTitledBorder("Travel details");
        Border outsideC = BorderFactory.createEmptyBorder(5, 5, 5, 5);
        center.setBorder(BorderFactory.createCompoundBorder(outsideC, innerC));

        JLabel fromLabel = new JLabel("From : ");
        JTextField fromField = new JTextField("to", 30);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.weighty = 0;
        gbc.insets = new Insets(5, 4, 5, 5);
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.LINE_END;
        center.add(fromLabel, gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.weighty = 0;
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.gridwidth = 1;
        center.add(fromField, gbc);

        JButton trainImage = new JButton();
        BufferedImage image = 
                new BufferedImage(40,10,BufferedImage.TYPE_INT_RGB);
        trainImage.setIcon(new ImageIcon(image));

        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.gridwidth = 3;
        gbc.ipadx = 5;
        center.add(trainImage, gbc);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            CenteredImageInGridBag o = new CenteredImageInGridBag();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}
作者: Andrew Thompson 发布者: 2017 年 12 月 28 日
32x32