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 圖形教程以獲取更多詳細信息
添加回答
舉報