我正在女巫中做一个学校项目,我必须模拟一个蚁群,并在图形用户界面中显示它。
整个项目几乎完成了,但是我没有为jPanel实现缩放功能。
我在这个站点上找到了一个基本符合我需要的线程。这里是链接: Zooming in and zooming out within a panel
我基本上需要Thanasis在该线程中进行的操作,但是我不知道如何在其他类中的代码中实现它。
我是图形用户界面的新手,我们基本上通过做这个项目来学习和理解它,所以请原谅我答案很简单,我正在寻求答案。
我可以为Pannel和Window类提供代码。
我已经尝试过启动它,而没有想到它可以直接在我的jpanel上运行,但是它当然没有。也试图在我的主面板上调用它,但这也不起作用。这是我面板中的paintComponent。我基本上是对所有显示的东西(蚂蚁,殖民地,食物)这样做。
public void paintComponent(Graphics g){
int tailletab = this.gri.getTab().length;
//On récupère le tableau de la Grille
int[][] gril = this.gri.getTab();
int taillecarre;
int xcol = this.colo.getPos().getX();
int ycol = this.colo.getPos().getY();
int xsou = this.source.getPos().getX();
int ysou = this.source.getPos().getY();
if(tailletab<=50){
taillecarre = tailletab/4+2;
}else{
if(tailletab<60){
taillecarre = tailletab/5+1;
}else{
if(tailletab<70){
taillecarre = tailletab/7+1;
}else{
if(tailletab<80){
taillecarre = tailletab/8;
}else{
if(tailletab<90){
taillecarre = tailletab/10;
}else{
taillecarre = tailletab/13;
}
}
}
}
}
for(int i=0; i<tailletab; i++){
for(int j=0; j<tailletab; j++){
if(gril[j][i]==0){
if(j==xcol && i==ycol){
g.setColor(new Color(102, 51, 0));
g.fillRect(xcol*taillecarre, ycol*taillecarre,taillecarre,taillecarre);
g.setColor(Color.BLACK);
g.drawRect(xcol*taillecarre, ycol*taillecarre,taillecarre,taillecarre);
}else{
if(j==xsou && i==ysou){
g.setColor(Color.RED);
g.fillRect(xsou*taillecarre, ysou*taillecarre,taillecarre,taillecarre);
g.setColor(Color.BLACK);
g.drawRect(xsou*taillecarre, ysou*taillecarre,taillecarre,taillecarre);
}else{
g.setColor(Color.BLACK);
g.drawRect(j*taillecarre, i*taillecarre, taillecarre, taillecarre);
}
}
}else{
g.setColor(Color.BLACK);
g.drawRect(j*taillecarre, i*taillecarre, taillecarre, taillecarre);
g.fillRect(j*taillecarre, i*taillecarre, taillecarre, taillecarre);
}
}
}
}
答案 0 :(得分:0)
您提供的链接中Andreas Holstenson的答案比Thanasis更好,因为您不应该像正确地那样覆盖paint
而是paintComponent
,并且Thanasis不会覆盖转换,而是尝试对于不逐步更新转换而感到愚蠢。如果您迷失了我,只需完全忘记那个答案。
否则,是否使用AffineTransform
的选择无关紧要,因为结果是相同的。可以说AffineTransform
更易于使用。
要回答您的问题,请将附加的缩放/翻译代码放在该方法的顶部,然后缩放所有绘制的图形(即使您使用g
而不是g2
也是如此)。
@Override
protected void paintComponent(Graphics g) { // No need to widen it to public
Graphics2D g2 = (Graphics2D)g;
AffineTransform oldTransform = g2.getTransform();
try {
float zoom = 0.5f; // shrink
// Note that transforms are in reverse order
// because of how matrix multiplications work.
AffineTransform newTransform = new AffineTransform();
// 2nd transform: re-center
newTransform.translate(getWidth() * (1 - zoom) / 2,
getHeight() * (1 - zoom) / 2);
// 1st transform: zoom (relative to upper-left corner)
newTransform.scale(zoom, zoom);
g2.transform(newTransform);
// Draw here
} finally {
// Try-finally is probably not required, but ensures that the transform
// gets restored even if an exception is thrown during drawing.
g2.setTransform(oldTransform);
}