簡體   English   中英

不繪制Java的Paint方法

[英]Paint method not painting Java

我的繪制方法似乎無法繪制我的 20x20 單元格。 我有一個用於單元格的布爾數組來控制它們的狀態,如果為真,則調用單元格繪制方法,繪制單元格但是我有兩個問題;

  1. 一次只繪制一個,這很奇怪,因為我應該有一個 40x40 的布爾數組,這意味着我有 40x40 個單元格

  2. 他們實際上並沒有准確地繪制我點擊的位置。 我不知道這是怎么回事,因為當我獲得我的點擊坐標時,我立即將這些坐標作為我的 x 和 y 值放置在我的繪畫方法中。

主要的


import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferStrategy;

public class mainApplication extends JFrame implements Runnable, MouseListener {


    private static final Dimension windowsize = new Dimension(80, 600);
    private BufferStrategy strategy;
    private Graphics offscreenGraphics;
    private static boolean isGraphicsInitialised = false;
    private static int rows = 40;
    private static int columns = 40;
    private static int height = windowsize.height;
    private static int width = windowsize.width;
    private static Cells cells = new Cells();
    private int xArrayElement,yArrayElement, xPosition, yPosition;
    private static boolean gameState[][] = new boolean[rows][columns];


    public mainApplication() {


        System.out.println(System.getProperty("user.dir"));

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Dimension screensize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

        int x = screensize.width / 2 - windowsize.width / 2;
        int y = screensize.height / 2 - windowsize.height / 2;

        setBounds(x, y, screensize.width, screensize.height);

        setVisible(true);

        createBufferStrategy(2);

        strategy = getBufferStrategy();

        offscreenGraphics = strategy.getDrawGraphics();

        isGraphicsInitialised = true;

       // MouseEvent mouseEvent = new MouseEvent();
        addMouseListener(this);
       // addMouseMotionListener(MouseEvent);

        Thread t = new Thread(this);

        t.start();

    }


    public void mousePressed(MouseEvent e) { }

    public void mouseReleased(MouseEvent e) { }

    public void mouseEntered(MouseEvent e) { }

    public void mouseExited(MouseEvent e) { }

    public void mouseClicked(MouseEvent e) {

        if(e.getClickCount() == 1){

               xPosition = e.getX();
               yPosition = e.getY();

           cells.setPosition(xPosition,yPosition);

            xArrayElement = (xPosition/20);
            yArrayElement = (yPosition/20);

            if(gameState[xArrayElement][yArrayElement]){
                gameState[xArrayElement][yArrayElement] = false;
            }
            else if (!gameState[xArrayElement][yArrayElement]) {
                gameState[xArrayElement][yArrayElement] = true;
            }
            else(gameState[xArrayElement][yArrayElement]) = true;
        }
    }

    @Override
    public void run() {
            while (true) {

                try { //threads entry point
                    Thread.sleep(20); //forces us to  catch exception
                }

                catch (InterruptedException e) {
                }
              this.repaint();
            }
        }


    public void paint(Graphics g) {

        if (isGraphicsInitialised) {
            g = strategy.getDrawGraphics();

            g.setColor(Color.BLACK);

            g.fillRect(0, 0, 800, 800);


                    if (gameState[xArrayElement][yArrayElement]) {
                        g.setColor(Color.WHITE);
                        cells.paint(g);
                        System.out.println(xPosition);
                    }

                    else if (!gameState[xArrayElement][yArrayElement]) {

                        g.setColor(Color.BLACK);
                        g.fillRect(xPosition, yPosition, 20, 20);
                    }

                strategy.show();
            }
        }

    public static void main(String[]args){

        mainApplication test = new mainApplication();

    }
}

細胞類別


import java.awt.*;

public class Cells {

    int x;
    int y;


    public Cells(){

    }

    public void setPosition(int xi, int xj){

        x = xi;
        y = xi;
    }

    public boolean cellState(boolean visible){

        return visible;
    }

    public void paint(Graphics g){

        g.drawRect(x, y, 20,20);
    }
}

你做錯了很多事情。 我的第一個建議是忘記屏幕外的圖形,並確保你正在做你想做的事。 您可以隨時創建圖像。 以下是一些基本准則:

  • 不要擴展JFrame 使用實例。
  • 擴展JPanel或創建一個擴展類JPanel ,並加入到框架實例
  • 然后覆蓋paintComponent(g)並使用該圖形上下文進行繪制。

這是一個較早的答案,可能有助於Can't add Graphics into JPanel in Java

更多信息可以在Java繪畫教程中找到。

更新 我花了幾分鍾才找到這個。

 public void setPosition(int xi, int xj){
        x = xi;
        y = xi; // <--- should be xj
 }

關於上述(1) 每次輸入paintComponent時都必須重新繪制每個單元格。 這意味着您需要遍歷列表並將它們繪制在正確的位置。 現在你只在每個條目上畫一個。

還有一些建議。 與其搞亂線程並在循環中每 20 毫秒調用一次重繪,為什么不直接在mouseClicked()方法中調用repaint

如果您最終需要每 20 毫秒繪制一次。 我建議按如下方式使用swing Timer :(檢查 JavaDoc 以確保我的語法正確!!)

Timer timer  = new Timer(0, (ev)-> frame.repaint());
timer.setDelay(20);
timer.start();

您可以創建自己的mouseListener類並擴展MouseAdapter 這些適配器類的目的是保持混亂,這樣您就不必使用空方法來滿足接口要求。 將類放在主類中,以便它可以訪問適當的數據結構。 然后只需將它的一個實例添加到目標組件的鼠標偵聽器。

暫無
暫無

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

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