2 回答

TA贡献1848条经验 获得超2个赞
每次绘制时都会缩放它。因此,如果在您进行缩放后比例因子没有设置为 1,那么每次绘制它时它都会变大或变小。在paintComponent 中创建新数组以传递缩放值但保留原始值。
*编辑
@Override
protected void paintComponent(Graphics graphics) {
int[] xS = new int[3];
int[] yS = new int[3];
super.paintComponent(graphics);
for(int i = 0; i<3; i++){
xS[i]=(int)(x[i]*scX);
yS[i]=(int)(y[i]*scY);
}
graphics.fillPolygon(xS,yS,3);
}

TA贡献1780条经验 获得超1个赞
由于您正在处理多边形,因此最简单的解决方案是利用 API 的现有功能,通过使用 aAffineTransform
来更改输出的比例
https://i.stack.imgur.com/e2vLR.gif
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
MyTriangle shape = new MyTriangle(50, 100, 0, 0, 100, 100, 0, 0, 0);
JSlider slider = new JSlider(0, 400);
slider.setValue(100);
frame.add(shape);
frame.add(slider, BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
double value = slider.getValue() / 100d;
shape.setScale(value);
}
});
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MyTriangle extends JPanel {
int[] x;
int[] y;
double scX;
double scY;
public MyTriangle(int x1, int x2, int x3, int y1, int y2, int y3, int red, int green, int blue) {
this.x = new int[]{x1, x2, x3};
this.y = new int[]{y1, y2, y3};
scX = 1;
scY = 1;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
public void setScale(double scale) {
scX = scale;
scY = scale;
repaint();
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D g2d = (Graphics2D) graphics.create();
AffineTransform at = AffineTransform.getScaleInstance(scX, scY);
g2d.setTransform(at);
g2d.fillPolygon(x, y, 3);
g2d.dispose();
}
}
}
我强烈建议您查看2D 图形教程以获取更多详细信息
添加回答
举报