我对在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内的按钮也不在中心。我意识到这些都可能是简单的布局修复,但我不知道从哪里开始。
答案 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
它的外观如下:
此外,很少有观察结果:
永远不要为您的组件调用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)
答案 2 :(得分:2)
我建议您花一些时间浏览A Visual Guide to Layout Managers。这将有助于您熟悉标准API提供的布局管理器。需要一些经验和努力才能弄清楚哪些是正确的工具,以获得您想要的精确外观。一旦您对标准API提供的内容感到满意,您还应该查看提供其他选项的第三方布局管理器API。
答案 3 :(得分:1)
我必须在JFrame中使用我需要对齐的面板(左边一个, 一个在右边)和我需要的其中一个面板中的几个按钮 在小组中居中。这是我的代码。
我意识到这些都可能是简单的布局修复,但我没有 线索从哪里开始。
使用比实际使用的简单FlowLayout
更复杂的布局。我建议你使用
GridBagLayout
强> BoxLayout
强>