Java 背景中的完整窗口按钮

Java 背景中的完整窗口按钮,java,swing,layout-manager,null-layout-manager,Java,Swing,Layout Manager,Null Layout Manager,我正在尝试创建一个JFrame,上面有很多JButton,。40在中间,4行,6个JPutt在垂直线左侧。问题是,侧边按钮下面的第五个按钮出现在所有其他按钮后面,占据了整个窗口。我不知道这是从哪里来的,因为我从来没有将JButton的大小设置为那么大,或者设置为适合屏幕 import javax.swing.*; public class Buttons { static JButton[][] middle = new JButton [10][4]; //middle buttons st

我正在尝试创建一个JFrame,上面有很多JButton,。40在中间,4行,6个JPutt在垂直线左侧。问题是,侧边按钮下面的第五个按钮出现在所有其他按钮后面,占据了整个窗口。我不知道这是从哪里来的,因为我从来没有将JButton的大小设置为那么大,或者设置为适合屏幕

import javax.swing.*;
public class Buttons {

static JButton[][] middle = new JButton [10][4]; //middle buttons
static JButton[] colours = new JButton[6]; //colour buttons


public static void main (String arg[]) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(600,700);

    int xcor = 100; //x coordinate
    int ycor = 5; //y coordinate

    //middle buttons
    for (int y = 0; y<10; y++) {
        for (int x = 0; x<4; x++) {
            middle[y][x] = new JButton();
            middle[y][x].setBounds(xcor, ycor, 100, 60);
            middle[y][x].setVisible(true);
            frame.getContentPane().add(middle[y][x]);

            xcor+=100;
        }
        xcor=100;
        ycor+=60;
    }

    //colour buttons 
    ycor=65;
    for (int y = 0; y<5; y++){
        colours[y] = new JButton();
        colours[y].setBounds(5, ycor, 90, 60);

        switch (y) {
        case 0: colours[y].setText("Red");
        break;
        case 1: colours[y].setText("Blue");
        break;
        case 2: colours[y].setText("Green");
        break;
        case 3: colours[y].setText("Yellow");
        break;
        case 4: colours[y].setText("Purple");
        break;
        case 5: colours[y].setText("Black");
        break;
        }
        colours[y].setVisible(true);
        frame.getContentPane().add(colours[y]);

        ycor += 60;
    }
    frame.setVisible(true);
}
import javax.swing.*;
公共类按钮{
静态JButton[][]中间=新JButton[10][4];//中间按钮
静态JButton[]颜色=新JButton[6];//颜色按钮
公共静态void main(字符串arg[]){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架尺寸(600700);
int xcor=100;//x坐标
int ycor=5;//y坐标
//中间按钮

for(int y=0;y将布局设置为
null
frame.setLayout(null);
)可以解决此特定问题,但会引入更多问题。制作自定义
LayoutManager
将是更好的解决方案。

此布局可以通过使用
GridLayout
的两个实例来实现(左边的一个是单列网格布局,而右边的一个可以是
JPanel
中的
GridLayout(0,4)
)。然后这两个面板可以设置
EmptyBorder
集,并添加到
BorderLayout
行开始和
中心

像这样:

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.*;

public class Buttons {

    private JButton[][] middle = new JButton[10][4]; //middle buttons
    private JButton[] colours = new JButton[6]; //colour buttons

    Buttons() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // unnecessary, just lay it out and call pack()!
        //frame.setSize(600, 700);

        Insets zeroMargin = new Insets(0, 0, 0, 0);
        BufferedImage bi = new BufferedImage(
                50, 30, BufferedImage.TYPE_INT_ARGB);

        JPanel middlePanel = new JPanel(new GridLayout(0, 4));
        middlePanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        frame.add(middlePanel, BorderLayout.CENTER);

        //middle buttons
        for (int y = 0; y < 10; y++) {
            for (int x = 0; x < 4; x++) {
                JButton b = new JButton();
                middle[y][x] = b;
                b.setMargin(zeroMargin);
                b.setIcon(new ImageIcon(bi));
                middlePanel.add(b);
            }
        }

        JPanel colorButtons = new JPanel(new GridLayout(0, 1));
        JPanel colorButtonsConstrain = new JPanel(new FlowLayout());
        colorButtons.setBorder(new EmptyBorder(65, 5, 5, 0));
        colorButtonsConstrain.add(colorButtons);
        frame.add(colorButtonsConstrain, BorderLayout.LINE_START);
        Color[] colors = {
            Color.RED, Color.BLUE, Color.GREEN,
            Color.YELLOW, Color.MAGENTA.darker(), Color.BLACK
        };
        // colour buttons
        for (int y = 0; y < colors.length; y++) {
            JButton b = new JButton();
            b.setMargin(zeroMargin);
            b.setIcon(new ImageIcon(bi));
            colours[y] = b;
            b.setBackground(colors[y]);
            colorButtons.add(b);
        }

        frame.pack();
        frame.setMinimumSize(frame.getSize());
        frame.setVisible(true);
    }

    public static void main(String arg[]) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                new Buttons();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

import java.awt.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入javax.swing.border.*;
公共类按钮{
私有JButton[][]中间=新JButton[10][4];//中间按钮
私有JButton[]颜色=新JButton[6];//颜色按钮
按钮(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//不需要,只需将其布局并调用pack()!
//框架设置尺寸(600700);
插图零边距=新插图(0,0,0,0);
BuffereImage bi=新的BuffereImage(
50,30,BuffereImage.TYPE_INT_ARGB);
JPanel middlePanel=新的JPanel(新的网格布局(0,4));
中间面板。新订单(新的空订单(5,5,5,5));
添加(中间面板、边框布局、中心);
//中间按钮
对于(int y=0;y<10;y++){
对于(int x=0;x<4;x++){
JButton b=新JButton();
中间[y][x]=b;
b、 设置边距(零边距);
b、 设置图标(新图像图标(bi));
添加(b);
}
}
JPanel colorButtons=新的JPanel(新的GridLayout(0,1));
JPanel colorButtonsConstrain=新的JPanel(新的FlowLayout());
颜色按钮。设置顺序(新的清空顺序(65,5,5,0));
colorButtonsConstrain.add(colorButtons);
帧。添加(彩色按钮图标、边框布局。行\u开始);
颜色[]颜色={
颜色。红色,颜色。蓝色,颜色。绿色,
Color.YELLOW,Color.洋红.darker(),Color.BLACK
};
//彩色按钮
对于(int y=0;y
您知道框架默认使用的是
边框布局吗?不。请原谅我的无知,我是一名新程序员,这有什么作用?我将布局设置为null,这解决了问题。谢谢:)“我将布局设置为null,这解决了问题。”祝贺您。您刚刚将一个小问题替换为至少5个大问题。Java GUI可能必须在多个平台上工作,使用不同的屏幕分辨率和不同的PLAF。因此,它们不利于组件的精确放置。要将组件组织为一个健壮的GUI,请使用布局管理器,或者alo为.y.
颜色[y].setText(“红色”);
使用布局填充和边框。这可能更适合
JColorChooser
。有关详细信息,请参阅。“…制作自定义
LayoutManager
将是更好的解决方案。”更好的选择是,但不需要。请参见图片。可以通过使用两个
GridLayout
实例来实现(左侧的实例为单列网格布局,而右侧的实例为
GridLayout(0,4)
)每个面板都位于
JPanel
中。然后,这两个面板可能会设置一个
EmptyBorder
集,并被添加到
边框布局的
行和
中心。例如,如我的回答中所示。也可以查看编辑。您可能需要调整边框中的一些数字以获得所需的准确结果。