JAVA中的镜像形状(Swing)
大家好 我有一个家庭作业,涉及在Swing GUI中绘制和操作形状 我遇到了一个问题,当我尝试镜像我的形状时,我没有得到我想要的结果 drawallnodes方法在Jpanels paintComponent中调用JAVA中的镜像形状(Swing),java,swing,shape,graphics2d,mirror,Java,Swing,Shape,Graphics2d,Mirror,大家好 我有一个家庭作业,涉及在Swing GUI中绘制和操作形状 我遇到了一个问题,当我尝试镜像我的形状时,我没有得到我想要的结果 drawallnodes方法在Jpanels paintComponent中调用 public void drawallnodes(ArrayList<DevicesEditor> nodes, Graphics2D g2) { int arraysize = nodes.size(); ArrayList<DevicesEdit
public void drawallnodes(ArrayList<DevicesEditor> nodes, Graphics2D g2)
{
int arraysize = nodes.size();
ArrayList<DevicesEditor> temparray;
AffineTransform at = new AffineTransform();
if (nodes.size() != 0)
{
System.out.println("nodes.size " + nodes.size());
if (currentarrayindex >= 0)
{
AffineTransform afx = new AffineTransform();// for rotate
for (int i = 0; i <= currentarrayindex; i++)
{
if (nodes.get(i).getWasAngleChanged())
{
afx.rotate(
Math.toRadians(nodes.get(i).getAngleInDegrees()),
nodes.get(i).getCenter().x,
nodes.get(i).getCenter().y);
nodes.get(i).setShape(
afx.createTransformedShape(nodes.get(i).getShape()));
nodes.get(i).setWasAngleChanged(false);
nodes.get(i).setokrajRectangle();
}
try
{
Rectangle r = nodes.get(i).getShape().getBounds();
}
catch (Exception e)
{
System.out.println(
"Exception found at getbounds, no shape with getbounds found");
}
AffineTransform saveXform = g2.getTransform();
g2.setColor(nodes.get(i).getColor());
int w = getWidth();
// it gets the JPanels width, which is set to 758px
at = AffineTransform.getTranslateInstance(w, 0);
System.out.println("*********Get width of shape: " + w);
at.scale(-1, 1); // mirror -x, y
g2.setPaint(Color.red);
g2.draw(at.createTransformedShape(nodes.get(i).getShape()));
try
{
g2.drawString(nodes.get(i).getText(),
(int) nodes.get(i).getCenter().getX(),
(int) nodes.get(i).getCenter().getY());
}
catch (Exception e)
{
System.err.println("No text found at node");
}
try
{
g2.draw((Shape) nodes.get(i).getShape());
}
catch (Exception e)
{
System.err.println("No shape found at node");
}
// g2.transform(AffineTransform.getRotateInstance(0, 1));
g2.setTransform(saveXform);
}
}
}
}
public void drawallnodes(ArrayList节点,Graphics2D g2)
{
int arraysize=nodes.size();
数组列表临时数组;
AffineTransform at=新的AffineTransform();
如果(nodes.size()!=0)
{
System.out.println(“nodes.size”+nodes.size());
如果(currentarrayindex>=0)
{
AffineTransform afx=新的AffineTransform();//用于旋转
对于(int i=0;i当您使用简单的仿射变换(如scale(-1,1)
)变换形状时,它将在x=0时水平镜像。也就是说,当对象位于(300100)时,它随后将位于(-300100)
为了“就地”(即在其中心点的x坐标处)镜像对象,必须
- 移动对象,使其中心位于x=0
- 镜像对象
- 将对象移回其原始位置
此转换序列可以(也应该)由单个仿射变换表示,该变换可以通过连接表示各个步骤的仿射变换获得。例如,您可以创建如下方法
private static Shape mirrorAlongX(double x, Shape shape)
{
AffineTransform at = new AffineTransform();
at.translate(x, 0);
at.scale(-1, 1);
at.translate(-x, 0);
return at.createTransformedShape(shape);
}
为了绘制在其中心水平翻转(即镜像)的形状,可以调用
g.fill(mirrorAlongX(shape.getBounds2D().getCenterX(), shape));
顺便说一句:摆脱所有这些异常
在那里被捕获!这是一种可怕的风格。例如,将打印“在节点上找不到文本”的异常检查替换为
String text = nodes.get(i).getText();
if (text != null)
{
g2.drawString(text, ...);
}
else
{
System.err.println("No text found at node"); // May not even be necessary...
}
感谢您的快速响应。您的解决方案似乎是正确的,谢谢。您能帮我获得放大/缩小功能吗?还有,我如何为您的快速回答添加分数:) Regards@user3050538当您创建一个关于放大面板或特别是放大形状的问题时,我或stackoverflow上其他数百万人中的一个肯定会回答。