如何在JPanels / JFrame中对齐元素?

时间:2013-02-17 21:25:15

标签: java swing jframe jpanel layout-manager

我对在java中使用GUI完全不熟悉,所以我在弄清楚如何对齐我需要的所有东西时遇到了一些麻烦。我需要在我的JFrame中对齐我需要对齐的面板(一个在左边,一个在右边)和一个面板中的几个按钮,我需要在面板中居中。这是我的代码。

package application;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.nio.*;
import java.util.*;

public class Main extends JPanel 
{
    public static void main(String[] args)
    { 
        //set the ui to the native OS
        try
        { 
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(ClassNotFoundException | InstantiationException | IllegalAccessException 
        | UnsupportedLookAndFeelException e)                                   
        {
        }

        JFrame frame = new JFrame("Application Name");
        Menu menu = new Menu();
        JPanel iconPanel = new JPanel();
        final JPanel grid = new JPanel(new FlowLayout());
        JButton firewallButton = new JButton("Firewall");
        JButton networkButton = new JButton("Network");
        JButton printerButton = new JButton("Printer");

        int iconPanelSizeX;
        int iconPanelSizeY;
        int gridSizeX;
        int gridSizeY;
        int gridPosition;

        //frame setting
        frame.setSize(800, 600);
        frame.setMinimumSize(new Dimension(800, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        //add grid and iconPanel JPanels to the frame
        frame.add(iconPanel);
        iconPanel.add(firewallButton);
        iconPanel.add(networkButton);
        iconPanel.add(printerButton);
        frame.add(grid);        

        //iconPanel settings
        iconPanel.setBorder(BorderFactory.createLoweredSoftBevelBorder());
        iconPanel.setBackground(Color.gray);
        iconPanel.setLayout(new FlowLayout());
        iconPanel.setSize(new Dimension(100, 600));
        iconPanel.setVisible(true);

        //grid setting
        grid.setBackground(Color.red);
        grid.setSize(new Dimension(700, 600));
        grid.setVisible(true);

        //this is for resizing components when the user resizes the window
        int counter = 0;
        while(counter == 0)
        {
            firewallButton.setSize(new Dimension(iconPanel.getWidth(), 50));
            networkButton.setSize(new Dimension(iconPanel.getWidth(), 50));
            printerButton.setSize(new Dimension(iconPanel.getWidth(), 50));
            iconPanelSizeX = frame.getWidth() / 10;
            iconPanelSizeY = frame.getHeight();
            gridSizeX = (frame.getWidth() / 10) * 9;
            gridSizeY = frame.getHeight();
            iconPanel.setSize(new Dimension(iconPanelSizeX, iconPanelSizeY));
            grid.setSize(new Dimension(gridSizeX, gridSizeY));
        }
    }
}

如您所见,第二个JPanel(网格)不与框架的右侧对齐,而iconTray内的按钮也不在中心。我意识到这些都可能是简单的布局修复,但我不知道从哪里开始。

4 个答案:

答案 0 :(得分:7)

对于JFrame的简单拆分,您可以使用GridLayout包含1行和2列。

frame.setLayout(new GridLayout(1,2,3,3)); //3,3 are gaps
frame.add(grid);
frame.add(iconPanel);

对于面板中的组件居中,您可以使用FlowLayout上默认设置的JPanels

手动完成:

grid.setLayout(new FlowLayout()); //Centered components

grid.setLayout(new FlowLayout(FlowLayout.LEFT,3,3)); //Components aligned to left

grid.setLayout(new FlowLayout(FlowLayout.RIGHT,3,3)); //Components aligned to right

它的外观如下:

enter image description here

此外,很少有观察结果:

  • 永远不要为您的组件调用setXXXSize()方法;

  • 尽量避免为setSize();致电JFrame,而是致电pack();;

  • 在代码末尾调用setVisible(true);;

所有巨大的代码都可以“剥离”到这个:

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


public class Main extends JPanel
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Application Name");
        JPanel iconPanel = new JPanel();
        JPanel grid = new JPanel(new FlowLayout());
        JButton firewallButton = new JButton("Firewall");
        JButton networkButton = new JButton("Network");
        JButton printerButton = new JButton("Printer");


        frame.add(iconPanel);
        iconPanel.add(firewallButton);
        iconPanel.add(networkButton);
        iconPanel.add(printerButton);
        grid.setBackground(Color.GREEN);

        frame.setLayout(new GridLayout(1,2,3,3));
        frame.add(grid);
        frame.add(iconPanel);


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

答案 1 :(得分:5)

  

如何垂直对齐按钮?

此示例在框架的默认WEST的{​​{1}}区域中使用垂直Box

enter image description here

BorderLayout

答案 2 :(得分:2)

我建议您花一些时间浏览A Visual Guide to Layout Managers。这将有助于您熟悉标准API提供的布局管理器。需要一些经验和努力才能弄清楚哪些是正确的工具,以获得您想要的精确外观。一旦您对标准API提供的内容感到满意,您还应该查看提供其他选项的第三方布局管理器API。

答案 3 :(得分:1)

  

我必须在JFrame中使用我需要对齐的面板(左边一个,   一个在右边)和我需要的其中一个面板中的几个按钮   在小组中居中。这是我的代码。

     

我意识到这些都可能是简单的布局修复,但我没有   线索从哪里开始。

使用比实际使用的简单FlowLayout更复杂的布局。我建议你使用

  • GridBagLayout
  • BoxLayout

检查references here