按钮/ JPanel网格显示不正确

时间:2018-02-02 20:23:35

标签: java swing jpanel awt jbutton

我有3节课。 我想创建一个JPanel的3x3数组网格。 每个JPanel包含JButton s的3x3数组网格。 (它总共有81 JButton像数独一样。)

问题在于,当我执行我的程序时,它没有显示所有JPanel,只显示了几个JPanel s(带有JButton s)。

这是我的3个班的代码,我找不到问题所在......

Main上课:

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);

    }
}

Griglia上课:

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();
            }
        }
    }
}

Casella上课:

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);
    }

}

1 个答案:

答案 0 :(得分:2)

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

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

不建议尝试依赖null布局,从长远来看,这将导致问题无法解决。

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

首先查看Laying Out Components Within a ContainerHow to Use GridLayout

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

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

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.setLayout(new GridLayout(3, 3));
                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);
                        frame.add(g[i][ii]);
//                g[i][ii].setVisible(true);
//                g[i][ii].repaint();

//                f.repaint();
                    }
                }

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });

    }

/////////////////////////////////////////////////////////////////////
    public static 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);

            setLayout(new GridLayout(3, 3));

            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();
                }
            }
        }
    }

////////////////////////////////////////////////////////////////////////////
    public static class Casella extends JButton {

        int flag = 0;

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

    }
}