重画方法在错误的位置上绘制,但是在我最小化并重新打开窗口时修复了

问题描述 投票:0回答:2

这很奇怪,我有一个gui程序,允许用户通过检测鼠标单击来更新J面板。每次检测到鼠标单击时,JPanel都会重新绘制自身。出于某种原因,即使通过测试,重绘也偏离了30-40像素,这表明它们以完全相同的坐标进行绘画。但是,在我最小化然后重新最大化窗口之后,此问题得以解决。

以相同的方法在检测到鼠标单击之后在调用重画

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;


public class Canvas extends JPanel {  

    private  int sideLength = 50;
    private  int x = 10; 
    private  int y = 10;

    private  int xCoord; //this is the coordinate it will start painting
    private  int yCoord;

    private  int row = 0;
    private  int col = 0;

    private  Color[][] colors;

    public Canvas() {
        colors = new Color[x][y];
        for (int i =0; i<x;i++) {
            for (int j=0;j<y;j++) {
                colors[i][j]=MyFrame.getDefaultColor();
            }
        }
        System.out.println(colors[0][0]);
        System.out.println("this is the default "+MyFrame.getDefaultColor());
        setSize(x*sideLength,y*sideLength);
        addMouseListener(new Mouse());
    }

    public void draw() {
        repaint();
    }

    public void paintComponent (Graphics g) {
        super.paintComponents(g);
        this.setBackground(Color.WHITE);

        try {
            createCanvas(x,y,g,sideLength);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void createCanvas(int x, int y, Graphics g, int sideLength) throws InterruptedException {
        int coordX=0;
        int coordY=0;
        for(int i=0; i<x;i++) {
            for(int j=0; j<x;j++) {
                paintRectangle(g,colors[i][j],coordX,coordY,sideLength-1,sideLength-1);
                coordX=coordX+sideLength;
                //System.out.println("Coordx ="+coordX);
                //System.out.println("Coordy ="+coordY);

            }
            coordX=0;
            coordY=coordY+sideLength;
        }
    }

    private static void paintRectangle(Graphics g,Color color,int x, int y,int width,int height) throws InterruptedException {
        g.setColor(color);
        g.fillRect(x, y, width, height);
    }   

    class Mouse extends MouseAdapter{
        public void mouseClicked (MouseEvent e) {
            xCoord=e.getX();
            yCoord=e.getY();
            if(xCoord<=x*sideLength&&yCoord<+y*sideLength) {
                if(xCoord%sideLength>0) {
                    col = xCoord/sideLength+1;
                }else {
                    col = xCoord/sideLength;
                }
                if(yCoord%sideLength>0) {
                    row = yCoord/sideLength+1;
                }else {
                    row = yCoord/sideLength;
                }
            }
            colors[row-1][col-1]=MyFrame.getCurrentColor();
            draw();
        }
    }
}

before minimize

after minimize

java swing jframe jpanel repaint
2个回答
0
投票

您能否提供MyFrame类?我尝试使用此代码,并且效果很好:

import javax.swing.JFrame;
import java.awt.Color;

public class App extends JFrame {
    public static void main(String[] args) {
        App app = new App();
        app.start();
    }

    public static Color getCurrentColor() {
        return Color.GREEN.darker();
    }

    public void start() {
        setSize(400, 400);
        setVisible(true);
        add(new Canvas());
    }

    public static Color getDefaultColor() {
        return Color.BLUE;
    }
}

0
投票

替换

super.paintComponents(g);

with

super.paintComponent(g);
© www.soinside.com 2019 - 2024. All rights reserved.