Java 当JFrame包含GridLayout时,我可以为它设置特定的边框大小吗?
这是一个示例类Java 当JFrame包含GridLayout时,我可以为它设置特定的边框大小吗?,java,swing,awt,Java,Swing,Awt,这是一个示例类 import javax.swing.*; import java.awt.*; public class Image { public static void main(String[] args) { JFrame f = new JFrame(); Layout lo = new Layout(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.se
import javax.swing.*;
import java.awt.*;
public class Image {
public static void main(String[] args) {
JFrame f = new JFrame();
Layout lo = new Layout();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(new Dimension(500, 500));
f.setLocationRelativeTo(null);
f.getContentPane().add(lo.getGUI(), BorderLayout.CENTER);
f.setVisible(true);
}
}
这是它附带的布局类
import java.awt.*;
import javax.swing.*;
public class Layout {
private JPanel p;
public Layout() {
p = new JPanel(new GridLayout(5, 5, 1, 1));
p.setBackground(Color.BLACK);
JLabel[][] lbs = new JLabel[5][5];
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++) {
lbs[i][j] = new JLabel(".", JLabel.CENTER);
lbs[i][j].setBackground(Color.WHITE);
lbs[i][j].setOpaque(true);
p.add(lbs[i][j]);
}
}
public JComponent getGUI() {
return p;
}
}
import java.awt.*;
导入javax.swing.*;
公共班级布局{
私人JPanel p;
公共布局(){
p=新JPanel(新网格布局(5,5,1,1));
p、 挫折背景(颜色:黑色);
JLabel[]lbs=新JLabel[5][5];
对于(int i=0;i<5;i++)
对于(int j=0;j<5;j++){
lbs[i][j]=新的JLabel(“.”,JLabel.CENTER);
lbs[i][j].挫折背景(颜色.白色);
lbs[i][j].setOpaque(真);
p、 加上(磅[i][j]);
}
}
公共JComponent getGUI(){
返回p;
}
}
代码的结果如下:
所以,我的问题是,我如何能像上面的图片一样调整固定尺寸?我想以后再添加一些组件,比如上面的按钮。在对JPanel应用GridLayout之后,我不知道如何设置它的固定大小。我向它添加了GridLayout,因为我需要它显示类似于国际象棋的东西。除了按钮,我什么都不会碰。JPanel是供查看的,仅此而已
我应该提到的是,我将把网格中间的点改变成其他符号(例如,或!)来表示5x5空间中的对象。我使用JLabel来表示对象。如果我使用GridBagLayout,所有符号都会在一个区域中挤压在一起。
我不确定我是否100%理解你的要求,但是如果你想要网格周围的空白空间,那么也许你想要的是一个空序,可以通过BorderFactor.createEmptyBorder(间隙,间隙,间隙,间隙)
其中gap是边框的大小,当然每边的值都是唯一的
不要忘记嵌套JPanel,每个都使用自己的布局,以获得最大的布局效果。例如,以下GUI由下面的代码生成:
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
@抑制警告(“串行”)
公共类LayoutTest扩展了JPanel{
专用静态最终整数单元格_宽度=100;
专用静态最终内部侧=5;
专用静态最终整数间隔=25;
专用静态最终颜色BG=Color.WHITE;
专用布局面板LayoutPanel=新布局面板(单元格宽度,侧面);
公共布局测试(){
退避地(BG);
JPanel btnPanel=新JPanel(新网格布局(1,0,间隙,间隙));
添加(新的JButton(“按钮1”));
添加(新的JButton(“按钮2”));
btnPanel.倒退地面(BG);
setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
setLayout(新边界布局(间隙,间隙));
添加(layoutPanel、BorderLayout.CENTER);
添加(btnPanel,BorderLayout.PAGE_START);
}
私有静态void createAndShowGui(){
LayoutTest主面板=新建LayoutTest();
JFrame=新JFrame(“布局测试”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
调用器(()->createAndShowGui());
}
}
@抑制警告(“串行”)
类LayoutPanel扩展了JPanel{
专用静态最终颜色BG=Color.BLACK;
私有内部侧=5;
专用静态最终int内部_间隙=1;
专用静态最终颜色单元\u BG=Color.WHITE;
公共布局面板(内部单元宽度、内部侧面){
退避地(BG);
setboorder(BorderFactory.createLineBorder(BG));
这个边=边;
setLayout(新网格布局(边、边、内_间隙、内_间隙));
维度cellDim=新维度(cellWidth,cellWidth);
对于(int i=0;i
我不确定我是否100%理解您的要求,但如果您希望网格周围有空的空间,那么您需要的可能是一个空订单,可以通过BorderFactor.createEmptyBorder(gap,gap,gap,gap)轻松获得
其中gap是边框的大小,当然每边的值都是唯一的
不要忘记嵌套JPanel,每个都使用自己的布局,以获得最大的布局效果。例如,以下GUI由下面的代码生成:
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入javax.swing.*;
@抑制警告(“串行”)
公共类LayoutTest扩展了JPanel{
专用静态最终整数单元格_宽度=100;
专用静态最终内部侧=5;
专用静态最终整数间隔=25;
专用静态最终颜色BG=Color.WHITE;
专用布局面板LayoutPanel=新布局面板(单元格宽度,侧面);
公共布局测试(){
退避地(BG);
JPanel btnPanel=新JPanel(新网格布局(1,0,间隙,间隙));
添加(新的JButton(“按钮1”));
添加(新的JButton(“按钮2”));
btnPanel.倒退地面(BG);
setBorder(BorderFactory.createEmptyByOrder(间隙,间隙,间隙));
setLayout(新边界布局(间隙,间隙));
添加(layoutPanel、BorderLayout.CENTER);
添加(btnPanel,BorderLayout.PAGE_START);
}
私有静态void createAndShowGui(){
LayoutTest主面板=新建LayoutTest();
JFrame=新JFrame(“布局测试”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
塞维斯框架
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;
@SuppressWarnings("serial")
public class LayoutTest extends JPanel {
private static final int CELL_WIDTH = 100;
private static final int SIDES = 5;
private static final int GAP = 25;
private static final Color BG = Color.WHITE;
private LayoutPanel layoutPanel = new LayoutPanel(CELL_WIDTH, SIDES);
public LayoutTest() {
setBackground(BG);
JPanel btnPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
btnPanel.add(new JButton("Button 1"));
btnPanel.add(new JButton("Button 2"));
btnPanel.setBackground(BG);
setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
setLayout(new BorderLayout(GAP, GAP));
add(layoutPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.PAGE_START);
}
private static void createAndShowGui() {
LayoutTest mainPanel = new LayoutTest();
JFrame frame = new JFrame("Layout Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
@SuppressWarnings("serial")
class LayoutPanel extends JPanel {
private static final Color BG = Color.BLACK;
private int sides = 5;
private static final int INNER_GAP = 1;
private static final Color CELL_BG = Color.WHITE;
public LayoutPanel(int cellWidth, int sides) {
setBackground(BG);
setBorder(BorderFactory.createLineBorder(BG));
this.sides = sides;
setLayout(new GridLayout(sides, sides, INNER_GAP, INNER_GAP));
Dimension cellDim = new Dimension(cellWidth, cellWidth);
for (int i = 0; i < sides * sides; i++) {
JLabel label = new JLabel(".", SwingConstants.CENTER);
label.setPreferredSize(cellDim);
label.setBackground(CELL_BG);
label.setOpaque(true);
add(label);
}
}
}