Java组件对齐到左上角

Jus*_*s S 0 java layout swing jcomponent

我想将我的两个组件对齐到窗口的左上角。

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

public class MainFrame extends JFrame {
    public MainFrame() {
    JPanel mainPanel = new JPanel(new BorderLayout());
    JPanel gridbagPanel = new JPanel();
    this.setLayout(new BorderLayout());

    gridbagPanel.setLayout(new GridBagLayout());
    GridBagConstraints gc = new GridBagConstraints();

    JLabel nameLabel = new JLabel(player.getName());
    nameLabel.setHorizontalAlignment(SwingConstants.CENTER);
    nameLabel.setFont(new Font("Serif",Font.PLAIN,24));
    mainPanel.add(nameLabel, BorderLayout.NORTH);

    JLabel money = new JLabel("Pinigai: "+new Integer(player.getMoney()).toString());
    gc.gridx = 0;
    gc.gridy = 0;
    gc.anchor = GridBagConstraints.PAGE_START;
    gc.insets = new Insets(2,0,0,2);
    gridbagPanel.add(money,gc);

    JLabel job = new JLabel("Darbas: "+new Integer(player.getSkin()).toString());
    gc.gridx = 0;
    gc.gridy = 1;
    gc.insets = new Insets(2,0,0,2);
    gc.anchor = GridBagConstraints.LINE_START;
    gridbagPanel.add(job, gc);

    mainPanel.setBorder(new EmptyBorder(10,10,10,10));
    mainPanel.add(gridbagPanel,BorderLayout.WEST);

    add(mainPanel);
    getContentPane().revalidate();
}
Run Code Online (Sandbox Code Playgroud)

}目前看起来像这样: 组件的当前视图

我想在左上角有数字的行。

请注意,我知道JFrame(“ this” class)和mainPanel都使用BorderLayouts。

另一个不相关的问题:什么时候应该创建一个新GridBagConstraints对象?为什么我不能只将一个存储在私有实例变量中以用于所有需要的用途?

Mad*_*mer 5

的优点GridBagLayout在于,列/行的大小不固定(即,并非每行/列的大小都必须相同,例如GridLayout

您可以“鼓励”某些组件在给定区域内占据比其他组件更多的空间。

喜欢的东西weightx,并weighty描述多少可用空间的行/列应占据。添加NORTHWEST anchor约束,您应该开始看到所需的效果。

在此处输入图片说明

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class MainFrame extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new MainFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public MainFrame() {
        JPanel mainPanel = new JPanel(new BorderLayout());
        JPanel gridbagPanel = new JPanel();
        this.setLayout(new BorderLayout());

        gridbagPanel.setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        JLabel nameLabel = new JLabel("Bebras");
        nameLabel.setHorizontalAlignment(SwingConstants.CENTER);
        nameLabel.setFont(new Font("Serif", Font.PLAIN, 24));
        mainPanel.add(nameLabel, BorderLayout.NORTH);

        JLabel money = new JLabel("Pinigai: " + new Integer(66484).toString());
        gc.gridx = 0;
        gc.gridy = 0;
        gc.anchor = GridBagConstraints.NORTHWEST;
        gc.insets = new Insets(2, 0, 0, 2);
        gridbagPanel.add(money, gc);

        JLabel job = new JLabel("Darbas: " + new Integer(126).toString());
        gc.gridx = 0;
        gc.gridy = 1;
        gc.insets = new Insets(2, 0, 0, 2);
        gc.anchor = GridBagConstraints.NORTHWEST;
        gc.weightx = 1;
        gc.weighty = 1;
        gridbagPanel.add(job, gc);

        mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
        mainPanel.add(gridbagPanel, BorderLayout.WEST);

        add(mainPanel);
        getContentPane().revalidate();

    }
}
Run Code Online (Sandbox Code Playgroud)

通常,我会在该组件中添加一个“填充”组件,使用它将所有其他组件推到我想要的位置,但这取决于您要实现的目标。

看看如何使用GridBagLayout以了解更多详细信息