[英]how to resize a JComponent on repaint?
我有一个扩展jpanel的主类,一个内部类Brick,它使用图形参数在屏幕上绘制矩形,当面板尺寸更改时,我试图使这些矩形可调整大小,这些方法是在paintComponent()方法中绘制的。宽度和高度是用相同的方法分配的,我每30毫米调用一次paintComponent()砖块宽度是面板宽度的百分比,所以我试图将旧砖块宽度保存为变量,并通过将砖块的x坐标增加新旧砖块宽度之间的差异,但这是行不通的
我有以下代码:
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.
}
}
谢谢你的帮助
“当面板尺寸更改时,我试图使这些矩形可调整大小”
将面板作为参数传递给Brick
构造函数,然后使用面板的getWidth()
和getHeight()
方法绘制积木。 例如
class Brick {
private JComponent panel;
public Brick(JComponent panel, ....) {
this.panel = panel;
}
public void draw(Graphics g) {
int height = (int)(panel.getHeight() / BRICK_ROWS);
int width = (int)(panel.getWidth() / BRICK_COLS);
g.fillRect(x, y, width, height);
}
}
getWidth()
和getHeight()
将根据面板的当前大小来调整砖的大小。 您可以通过将面板尺寸除以每列/行的砖数来确定尺寸。 您可能需要稍微重组代码。 现在,所有这些都假设砖块处于网格状结构中
也不要在paintComponent
方法内设置组件状态。 如果您想(出于某些奇怪的原因)想要调整面板的大小,请使用timer方法。
将其移交给布局管理器以管理组件的位置和大小。 不要手动设置。
带有GridLayout
示例代码
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Maze {
private JFrame frame = null;
private Color[] colors = new Color[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW };
public Maze(int length) {
frame = new JFrame();
JPanel panel = new JPanel(new GridLayout(length, length, 5, 5));
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
JPanel p2 = new JPanel();
p2.setBackground(colors[(int) (Math.random() * colors.length)]);
panel.add(p2);
}
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Maze Game");
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.