我有一個擴展jpanel的主類,和一個使用圖形參數的內部類Brick在屏幕上繪製矩形,我試圖使這些矩形在面板大小更改時可調整大小 這些Bricks在paintComponent方法中繪製()的寬度和高度也分配在 相同的方法中,我調用paintComponent()每30millis 磚的寬度是面板寬度的百分比,所以我試圖將舊的磚寬度保存在一個變量,並增加x磚的座標由舊磚和新磚寬度之間的差異,但它不會工作如何調整重繪的JComponent?
我有以下代碼:
int width,height,brickHeight,brickWidth,tempBWidth,diffrence;
ArrayList<Brick> listOfBricks = new ArrayList<Panel.Brick>();
Timer timer = new Timer(30,this);
boolean bricksFilled,resized;
public Panel() {
setBackground(Color.BLACK);
setVisible(true);
timer.start();
} //end constructor Panel().
protected void paintComponent(Graphics g) {
width = getWidth(); height = getHeight();
setSize(width,height);
tempBWidth = brickWidth;
brickHeight = height/20; brickWidth = width/10;
if(width != 0 && tempBWidth != brickWidth) { diffrence = brickWidth - tempBWidth; }
super.paintComponent(g);
if(bricksFilled == false) { fillListOfBricks(); }
drawBricks(listOfBricks, g);
diffrence = 0;
} //end method paintComponent().
public void actionPerformed(ActionEvent event) {
repaint();
} //end method actionPerformed().
void fillListOfBricks() {
for (int row = 0;row < height/2;row += brickHeight+1) {
for (int column = 0;column < width;column += brickWidth+1) {
if(brickWidth != 0){
listOfBricks.add(new Brick(column,row,true,brickWidth,brickHeight));
bricksFilled = true;
} //end if.
} //end inner loop.
} //end outer loop.
} //end method fillListOfBricks().
void drawBricks(ArrayList<Brick> listOfBricks,Graphics g) {
for (Brick brick:listOfBricks) {
if(listOfBricks.isEmpty() == false) {
if (brick.visible) {
brick.draw(g);
} //end inner if.
} //end outer if.
} //end loop.
} //end method drawBricks().
class Brick {
int x,y;
int width,height,xDiff,yDiff;
boolean visible;
Color randomColor;
Brick(int x,int y,boolean visible,int width,int height) {
this.x = x; this.y = y; this.visible = visible;
this.width = width; this.height = height;
this.randomColor = getRandomColor();
} //end constructor Brick().
void draw(Graphics g) {
if(this.visible) {
System.out.println(diffrence);
g.setColor(this.randomColor);
System.out.println(x+" "+diffrence);
g.fillRect(x+diffrence, y, brickWidth,brickHeight);
g.setColor(Color.WHITE);
g.drawRect(x-1, y-1, brickWidth+1, brickHeight+1);
} // end if block.
} //end method draw().
Color getRandomColor() {
int R = (int)(255*(Math.random()));
int G = (int)(255*(Math.random()));
int B = (int)(255*(Math.random()));
return new Color(R,G,B);
} //end Method getRandomColor.
}
}
感謝您的幫助
'的setSize(寬度,高度)樣本代碼;'在'paintComponent'方法 - 從未設置paint方法 –
此外內部組件狀態,您的要求是不清楚。請嘗試添加更具描述性/可理解的問題描述,同時指出問題出現的位置 –
希望它現在更好 – user3612007