4

正如标题所说,我试图在 JFrame 的每个角落放置 4 个不同的 JLabel。即使我尝试调整 JFrame 的大小,我也希望他们永远留在那里

我尝试过使用布局管理器,但我就是做不好。

    ImageIcon icon;
    JLabel labelNW = new JLabel();
    JLabel labelNE = new JLabel();
    JLabel labelSW = new JLabel();
    JLabel labelSE = new JLabel();
    URL buttonURL = InputOutputTest.class.getResource("images/square_dot.gif");
    if(buttonURL != null){
        icon = new ImageIcon(buttonURL);
        labelNW.setIcon(icon);
        labelNE.setIcon(icon);
        labelSW.setIcon(icon);
        labelSE.setIcon(icon);
    }
    window.add(labelNW, BorderLayout.NORTH);
    //window.add(labelNE, BorderLayout.EAST);
    //window.add(labelSW, BorderLayout.WEST);
    window.add(labelSE, BorderLayout.SOUTH);

此代码负责左侧的北部和南部。不过,我可能正在接近这个错误。

我也尝试了 GridLayout (2,2),但它们不在拐角处,并且右侧有一个巨大的间隙。

4

3 回答 3

7

您将希望使用自己的布局嵌套每个 JPanel。事实上,您可以通过嵌套所有使用 BorderLayout 的 JPanel 来做到这一点。

打算检查一下 GridBagLayout 是否可以一次性完成.... 等等...

是的 GridBagLayout 也这样做:

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

import javax.swing.*;

public class GridBagExample {
   public static void main(String[] args) {
      JPanel mainPanel = new JPanel(new GridBagLayout());

      GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
            GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(
                  0, 0, 0, 0), 0, 0);
      mainPanel.add(new JLabel("Left Upper"), gbc);

      gbc.gridx = 1;
      gbc.gridy = 0;
      gbc.anchor = GridBagConstraints.NORTHEAST;
      mainPanel.add(new JLabel("Right Upper"), gbc);

      gbc.gridx = 0;
      gbc.gridy = 1;
      gbc.anchor = GridBagConstraints.SOUTHWEST;
      mainPanel.add(new JLabel("Left Lower"), gbc);

      gbc.gridx = 1;
      gbc.gridy = 1;
      gbc.anchor = GridBagConstraints.SOUTHEAST;
      mainPanel.add(new JLabel("Right Lower"), gbc);

      JFrame frame = new JFrame("Test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.setLocationRelativeTo(null);
      frame.pack();
      frame.setVisible(true);
   }
}

现在编辑
BorderLayout 示例:

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

import javax.swing.*;

public class BorderLayoutExample {
   public static void main(String[] args) {
      JPanel northPanel = new JPanel(new BorderLayout());      
      northPanel.add(new JLabel("North East"), BorderLayout.EAST);
      northPanel.add(new JLabel("North West"), BorderLayout.WEST);

      JPanel southPanel = new JPanel(new BorderLayout());
      southPanel.add(new JLabel("South East"), BorderLayout.EAST);
      southPanel.add(new JLabel("South West"), BorderLayout.WEST);


      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(northPanel, BorderLayout.NORTH);
      mainPanel.add(southPanel, BorderLayout.SOUTH);

      JFrame frame = new JFrame("BorderLayout Test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }
}
于 2013-08-14T01:06:06.967 回答
5

我发现这只GroupLayout给了我对精确布局的组件所需的控制。这应该可以解决问题。您需要确保两者之间的差距具有非常大的最大值(即Short.MAX_VALUE),但您可以将最小和首选尺寸设置为您想要的任何值。

public class LabelFrame extends JFrame {
    public LabelFrame() {
        JPanel contentPane = new JPanel();
        JLabel labelNW = new JLabel();
        JLabel labelNE = new JLabel();
        JLabel labelSW = new JLabel();
        JLabel labelSE = new JLabel();
        URL buttonURL = InputOutputTest.class.getResource("images/square_dot.gif");
        if(buttonURL != null){
            icon = new ImageIcon(buttonURL);
            labelNW.setIcon(icon);
            labelNE.setIcon(icon);
            labelSW.setIcon(icon);
            labelSE.setIcon(icon);
        }
        GroupLayout layout = new GroupLayout(contentPane);
        layout.setHorizontalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(Alignment.LEADING)
                        .addComponent(labelNW)
                        .addComponent(labelSW))
                .addGap(20,50,Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                        .addComponent(labelNE)
                        .addComponent(labelSE))
        );
        layout.setVerticalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(Alignment.LEADING)
                        .addComponent(labelNW)
                        .addComponent(labelNE))
                .addGap(20,50,Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                        .addComponent(labelSW)
                        .addComponent(labelSE))
        );
        contentPane.setLayout(layout);
        setContentPane(contentPane);
        pack();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                LabelFrame frame = new LabelFrame();
                frame.setVisible(true);
            }
        });
    }

}
于 2013-08-14T01:18:48.943 回答
2

我试过使用布局管理器..

布局管理器非常擅长他们的工作,但可能是这项工作的错误工具。考虑改用自定义边框。这是一个 例子

于 2013-08-14T22:13:15.623 回答