簡體   English   中英

帶顏色的雙維數組不會在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個Dot面板,但是在繪畫邏輯中,您將重新繪制所有36個點在彼此之上,因此僅顯示最后繪制的點。 paintComponent()方法應該只繪制一個點。

您需要更改MyDots類以接受Tile作為參數,然后將Tile對象保存為類的實例變量。 然后代碼將是這樣的:

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

我不知道你是否需要tile數組,因為現在MyDots類有tile信息。

那么你的繪畫邏輯應該是這樣的:

    //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,因為這個例外與你發布的代碼無關。

順便說一下,類名應該以大寫字母開頭。 它應該是“MyDot”。

編輯:

我是否必須在MyDots中創建一個新方法?

您需要為您的類創建一個構造函數:

public class MyDots
{
    private Tile tile;

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM