将4 JLabel放在JFrame的角落

时间:2013-08-14 01:05:16

标签: java swing jlabel layout-manager

正如标题所说,我试图在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),但他们不在角落,右侧有很大的差距。

3 个答案:

答案 0 :(得分:6)

您需要使用自己的布局嵌套 JPanels。事实上,你可以通过嵌套所有使用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);
   }
}

答案 1 :(得分:4)

我发现只有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);
            }
        });
    }

}

答案 2 :(得分:1)

  

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

布局经理对他们的工作非常了解,但也许是这项工作的错误工具。请考虑使用自定义边框。这是一个example