我通过此方法调用draw类:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
DrawGradient gradient = new DrawGradient();
gradient.draw(g);
DrawCoordinateSystem coor = new DrawCoordinateSystem();
coor.draw(g);
}
我试图转换DrawGradient类中的对象,但由于某种原因,DrawCoordinateSystem类中的图形对象会被转换。为什么?
DrawCoordinateSystem类:
public class DrawCoordinateSystem {
public DrawCoordinateSystem() {
// TODO Auto-generated constructor stub
}
public void draw(Graphics g1){
Color customcolor = new Color(210,191,245);
int x0 = 15, y0 = 15;
int Xpoints[] = {x0+45, x0+40, x0+40};
int Ypoints[] = {y0, y0-5, y0+5};
int Xpoints1[] = {x0, x0+5, x0-5};
int Ypoints1[] = {y0+45, y0+40, y0+40};
g1.setColor(customcolor);
g1.drawPolygon(Xpoints,Ypoints, 3);
g1.fillPolygon(Xpoints,Ypoints, 3);
g1.drawPolygon(Xpoints1,Ypoints1, 3);
g1.fillPolygon(Xpoints1,Ypoints1, 3);
g1.drawLine(x0, y0, x0+40, y0);
g1.drawLine(x0, y0, x0, y0+40);
g1.setFont(new Font("TimesRoman", Font.PLAIN, 12));
g1.drawString("x", 52, 30);
g1.setFont(new Font("TimesRoman", Font.PLAIN, 12));
g1.drawString("y", 23, 57);
}
}
绘图渐变类:
public class DrawGradient {
public DrawGradient() {
}
private Color c1;
private Color c2;
public void draw( Graphics g ) {
Graphics2D g2d1 = (Graphics2D) g;
GradientPaint gp = new GradientPaint(0, 0, c2, 0, 100, c1);
g2d1.setPaint(gp);
Rectangle reckt = new Rectangle(0,0,100,100);
g2d1.fill(reckt);
AffineTransform move = new AffineTransform();
move.translate(200, 200);
g2d1.setTransform(move);
}
}
转换是复合的,所以,一旦你应用了转换,你需要在完成后逆转它。
现在,您可以手动执行此操作,或者您可以在手动之前创建Graphics
上下文的副本,并在完成后将其处理掉。这可以防止您对要对原始副本进行的副本的属性进行任何更改(但您绘制的内容仍然存在)
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Color c1 = new Color(0, 0, 255);
Color c2 = new Color(0, 255, 255);
GradientPaint gp = new GradientPaint(0, 0, c1, 0, 100, c2);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(gp);
g2d.setTransform(AffineTransform.getTranslateInstance(100, 100));
g2d.fill(new Rectangle(0, 0, 100, 100));
g2d.dispose();
g2d = (Graphics2D) g.create();
g2d.setPaint(gp);
g2d.fill(new Rectangle(0, 0, 100, 100));
g2d.dispose();
}
}
例如,在您将上下文传递给其他方法之前,我需要创建一个图形上下文的副本
Graphics2D g2d =(Graphics2D)g.create();
DrawGradient gradient = new DrawGradient();
gradient.draw(g2d);
g2d.dispose();
g2d =(Graphics2D)g.create();
DrawCoordinateSystem coor = new DrawCoordinateSystem();
coor.draw(g2d);
g2d.dispose();
这样您就可以控制。如果您可以避免,我建议不要在绘制组件
方法中创建新对象,特别是如果这些对象并没有真正从一个绘制周期更改到另一个,因为绘制组件
可以快速连续调用多次
我正在制作一个带有Swing的GUI,它使用仿射变换来缩放绘制在JInternalFrame上的图形2D对象。问题是,它在当前状态下有问题,我不知道为什么。 为什么我的代码不能正确伸缩?为什么图形会在调整大小时“跳转”到面板顶部? 以下是我的独立示例:
在第三章“图层几何学”中,我们使用了UIView的transform属性旋转了钟的指针,但并没有解释背后运作的原理,实际上UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵(见图5.1)。 图5.1 用矩阵表示的CGAffineTra
我有一个名为的类。在这个类中,我有变量,它是类型。此外,我还有类,它重写函数: 我的airplane.rotateAirplane()函数如下所示: 当我运行我的程序时,只绘制对象。当我删除这条车道时 我也有我的飞机,但没有旋转。
我似乎无法让一种坐标格式与另一种格式配合使用。我想我只是没有使用正确的矩阵,但我对它们的了解还不够确定。我希望得到一些帮助,弄清楚我是否在假设我的转换应该是什么。 iText使用左下角作为ISO标准的原点,但pdfbox代码和从pdf中获取坐标的程序都使用左上角作为原点。 我应该做什么转换来调整坐标,以便iText能够以一种有效的方式使用它们? 我有一些代码,使用pdfbox来操作pdf并去除一些
所以基本上我想做的是只使用仿射变换和一个draw语句来绘制一个任意边数的多边形:。是的,我知道有一个函数——这不是这个问题的重点。为了简单起见,多边形是“正”多边形,这意味着它的所有边和边之间的角度都是相同的。 主要问题是,我不完全理解如何使点正确对齐: 我想要的只是在屏幕上画一个正方形。然而,台词到处都是。。。我猜这与的使用方式有关。
变换 变换包括就对象进行移动、旋转、镜像、缩放和倾斜。可以使用 “变换 ”面板、 “对象 ”>“变换 ”命令以及专用工具来变换对象。还可通过拖动选区的定界框来完成多种变换类型。 某些情况下,您可能要对同一变换操作重复数次,在复制对象时尤其如此。利用 “对象 ”菜单中的 “再次变换 ”命令,可以根据需要,重复执行移动、缩放、旋转、镜像或倾斜操作,直至执行下一变换操作。 对选定对象进行变换时,可以使用