Java 按钮/JPanel网格不';不能正确显示

Java 按钮/JPanel网格不';不能正确显示,java,swing,jpanel,awt,jbutton,Java,Swing,Jpanel,Awt,Jbutton,我有三节课。 我想创建JPanel的3x3数组网格。 每个JPanel包含一个由JButtons组成的3x3数组网格。(总共有81个按钮,就像数独游戏一样) 问题是,当我执行我的程序时,它不会显示所有的JPanels,只有少数JPanels(带有JButtons)出现 这是我的3个类的代码,我找不到问题出在哪里 Mainclass: import javax.swing.JFrame; public class Main { public static Griglia g[][] =

我有三节课。 我想创建
JPanel
的3x3数组网格。 每个
JPanel
包含一个由
JButton
s组成的3x3数组网格。(总共有81个按钮,就像数独游戏一样)

问题是,当我执行我的程序时,它不会显示所有的
JPanel
s,只有少数
JPanel
s(带有
JButton
s)出现

这是我的3个类的代码,我找不到问题出在哪里

Main
class:

import javax.swing.JFrame;

public class Main {

    public static Griglia g[][] = new Griglia[3][3];

    public static void main(String[] args) {

        JFrame f = new JFrame();


        Listener lis = new Listener();

        for(int i=0; i<3; i++)
        {
            for(int ii=0; ii<3; ii++)
            {
                g[i][ii]=new Griglia();
                g[i][ii].setLocation(i*155,ii*155);
                g[i][ii].repaint();
                g[i][ii].addMouseListener(lis);
                f.add(g[i][ii]);
                g[i][ii].setVisible(true);
                g[i][ii].repaint();

                f.repaint();

            }
        }

        f.setSize(470,500);

        f.setVisible(true);

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

public class Griglia extends JPanel{

    Casella c[][] = new Casella[3][3];
    int flag=0;

    public Griglia(){
        this.setSize(150,150);
        this.setLayout(null);
        this.setBackground(Color.black);

        for(int i=0; i<3; i++)
        {
            for(int ii=0; ii<3; ii++)
            {
                c[i][ii]=new Casella();
                c[i][ii].setLocation(i*50, ii*50);
                c[i][ii].repaint();
                this.add(c[i][ii]);
                this.repaint();
            }
        }
    }
}
import java.awt.Color;
import javax.swing.JButton;

public class Casella extends JButton{

    int flag=0;

    public Casella(){
        this.setSize(50,50);
        this.setBackground(Color.LIGHT_GRAY);
        this.setVisible(true);
    }

}
Casella
class:

import javax.swing.JFrame;

public class Main {

    public static Griglia g[][] = new Griglia[3][3];

    public static void main(String[] args) {

        JFrame f = new JFrame();


        Listener lis = new Listener();

        for(int i=0; i<3; i++)
        {
            for(int ii=0; ii<3; ii++)
            {
                g[i][ii]=new Griglia();
                g[i][ii].setLocation(i*155,ii*155);
                g[i][ii].repaint();
                g[i][ii].addMouseListener(lis);
                f.add(g[i][ii]);
                g[i][ii].setVisible(true);
                g[i][ii].repaint();

                f.repaint();

            }
        }

        f.setSize(470,500);

        f.setVisible(true);

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

public class Griglia extends JPanel{

    Casella c[][] = new Casella[3][3];
    int flag=0;

    public Griglia(){
        this.setSize(150,150);
        this.setLayout(null);
        this.setBackground(Color.black);

        for(int i=0; i<3; i++)
        {
            for(int ii=0; ii<3; ii++)
            {
                c[i][ii]=new Casella();
                c[i][ii].setLocation(i*50, ii*50);
                c[i][ii].repaint();
                this.add(c[i][ii]);
                this.repaint();
            }
        }
    }
}
import java.awt.Color;
import javax.swing.JButton;

public class Casella extends JButton{

    int flag=0;

    public Casella(){
        this.setSize(50,50);
        this.setBackground(Color.LIGHT_GRAY);
        this.setVisible(true);
    }

}

代码中最基本的问题是缺乏对布局管理API如何工作的理解

对于初学者来说,
JFrame
默认使用
BorderLayout
,这意味着在您的情况下,只会显示最后添加的组件

试图依赖
null
布局是不明智的,从长远来看会给您带来无尽的问题

更好的解决方案是找到一个或多个布局管理器来帮助您实现解决方案,例如,
GridLayout

首先看一看,然后

导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共班机{
公共静态格里利亚g[][]=新格里利亚[3][3];
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的GridLayout(3,3));
对于(int i=0;i<3;i++){
对于(int ii=0;ii<3;ii++){
g[i][ii]=新格里利亚();
//g[i][ii]。设定位置(i*155,ii*155);
//g[i][ii].重新绘制();
//g[i][ii].addMouseListener(lis);
框架.添加(g[i][ii]);
//g[i][ii].setVisible(真);
//g[i][ii].重新绘制();
//f.重新油漆();
}
}
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
/////////////////////////////////////////////////////////////////////
公共静态类Griglia扩展了JPanel{
卡塞拉c[][]=新卡塞拉[3][3];
int标志=0;
公共格里利亚(){
//这个。设置大小(150150);
//此.setLayout(null);
这个.背景(颜色.黑色);
setLayout(新的GridLayout(3,3));
对于(int i=0;i<3;i++){
对于(int ii=0;ii<3;ii++){
c[i][ii]=新的Casella();
//c[i][ii]。设定位置(i*50,ii*50);
//c[i][ii]。重新喷漆();
本条增补(c[i][ii]);
//这个。重新绘制();
}
}
}
}
////////////////////////////////////////////////////////////////////////////
公共静态类Casella扩展了JButton{
int标志=0;
公共Casella(){
//这个。设置大小(50,50);
此背景(颜色:浅灰色);
//此.setVisible(true);
}
}
}

代码中最基本的问题是对布局管理API的工作原理缺乏了解

对于初学者来说,
JFrame
默认使用
BorderLayout
,这意味着在您的情况下,只会显示最后添加的组件

试图依赖
null
布局是不明智的,从长远来看会给您带来无尽的问题

更好的解决方案是找到一个或多个布局管理器来帮助您实现解决方案,例如,
GridLayout

首先看一看,然后

导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共班机{
公共静态格里利亚g[][]=新格里利亚[3][3];
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的GridLayout(3,3));
对于(int i=0;i<3;i++){
对于(int ii=0;ii<3;ii++){
g[i][ii]=新格里利亚();
//g[i][ii]。设定位置(i*155,ii*155);
//g[i][ii].重新绘制();
//g[i][ii].addMouseListener(lis);
框架.添加(g[i][ii]);
//g[i][ii].setVisible(真);
//g[i][ii].重新绘制();
//f.重新油漆();
}
}
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);