带有颜色的二维数组不会在 paintComponent 中绘制

Double dimensional array with colours doesn't paint in paintComponent

我一直在研究类似的点,但我在画板上的点时遇到了问题。该数组似乎可以工作,但它不想绘制它。

抱歉,我的一些变量是荷兰语,但这不会造成太多混淆。

public class Bord extends JFrame{

    Slang slang = new Slang();
    Tile[][] tile = new Tile[6][6];

    private JPanel menuPanel;
    private JPanel gridPanel;

    private JLabel levelTitel;
    private JLabel levelNummer;

    private JLabel scoreTitel;
    private JLabel scoreNummer;

    private JLabel targetTitel;
    private JLabel targetNummer;

    private JLabel timeTitel;
    private JLabel timeNummer;

    private JLabel pauzeKnop;

    public Bord() {
        super("Dots");
        //setLocationRelativeTo(this);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        maakAttributen();
        maakListeners();
        maakLayout();
        pack();

        setSize(650, 750);

        setVisible(true);

        getContentPane();
        repaint();

        //TODO automatic size

    }

    public void maakAttributen() {


        levelTitel = new JLabel("level");
        levelNummer = new JLabel("1");

        scoreTitel = new JLabel("score");
        scoreNummer = new JLabel("2");

        targetTitel = new JLabel("target");
        targetNummer = new JLabel("3");

        timeTitel = new JLabel("time");
        timeNummer = new JLabel("4");

        //TODO image in knop zetten
        pauzeKnop = new JLabel("PAUZE");

    }

    public void maakListeners() {

    }

    public void maakLayout() {
        JPanel menuPanel = new JPanel(new GridLayout(0, 5, 5, 5));
        JPanel gridPanel = new JPanel(new GridLayout(0, 7, 5, 5));

        add(menuPanel, BorderLayout.PAGE_START);
        add(gridPanel, BorderLayout.CENTER);

        //menu attributen aan menu toevoegen
        menuPanel.add(levelTitel);
        menuPanel.add(scoreTitel);
        menuPanel.add(targetTitel);
        menuPanel.add(timeTitel);
        menuPanel.add(pauzeKnop);

        menuPanel.add(levelNummer);
        menuPanel.add(scoreNummer);
        menuPanel.add(targetNummer);
        menuPanel.add(timeNummer);

        //grid met dots toevoegen

        for (int x = 0; x < 6; x++) {
            for (int y = 0; y < 6; y++) {
                RandomKleur kleur = new RandomKleur();
                tile[x][y] = new Tile(kleur.getKleur());
                gridPanel.add(new myDots());
            }
        }
    }

    private class myDots extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            int h = getHeight();
            int w = getWidth();
            super.paintComponent(g);

            for (int x = 0; x < 6; x++) {
                for (int y =0; y < 6; y++) {
                    g.setColor(tile[x][y].getKleur());
                    g.fillOval(h / 2, w / 2, 33, 33);
                }
            }
        }
    }
}

我试过调试它,它有时会给出某种空指针异常。

你的基本绘画逻辑是错误的。您正在向框架添加 36 个点面板,但随后在绘画逻辑中您将所有 36 个点重新绘制在彼此之上,因此只会显示最后绘制的点。 paintComponent() 方法应该只绘制一个点。

您需要更改 MyDots class 以接受 Tile 作为参数,然后将 Tile 对象保存为 class 的实例变量。那么代码将类似于:

for (int x = 0; x < 6; x++) {
    for (int y = 0; y < 6; y++) {
        RandomKleur kleur = new RandomKleur();
        tile[x][y] = new Tile(kleur.getKleur());
        //gridPanel.add(new myDots());
        gridPanel.add(new myDots(tile[x][y]));
    }
}

我不知道你是否需要瓦片数组,因为现在 MyDots class 有瓦片信息。

那么你的绘画逻辑应该是这样的:

    //for (int x = 0; x < 6; x++) {
        //for (int y =0; y < 6; y++) {
            //g.setColor(tile[x][y].getKleur());
            g.setColor(tile.getKleur()); // where "tile" is the instance variable
            g.fillOval(h / 2, w / 2, 33, 33);
        //}
    //}

谁知道你为什么得到 NPE,因为异常与你发布的代码无关。

顺便说一句 class 名字应该以大写字母开头。应该是 "MyDot".

编辑:

Do I have to create a new method in MyDots?

您需要为 class 创建一个构造函数:

public class MyDots
{
    private Tile tile;

    public MyDots(Tile tile)
    {
        this.tile = tile;
    }

    @Override
    protectect paintComponent(Graphics g)
    ...
}