这很奇怪,我有一个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();
}
}
}
您能否提供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;
}
}
替换
super.paintComponents(g);
with
super.paintComponent(g);