java panel 左对齐,将Shape的中心与JPanel的中心对齐 - java

我一直在尝试将java2d形状的中心与JPanel的中心对齐,但没有成功。我能够使用getBounds方法对图像和许多2D形状(如平行四边形)执行此操作,但对于菱形却无法做到,尽管它们都遵循相同的模式。彻底地,当我从实际项目中准备SSCCE时,我无法正确对齐它们。

我已经编写了一个drawShape方法来在中心上绘制形状。我不明白我要去哪里错了。

这是SSCCE:

import java.awt.*;

import java.awt.geom.*;

import java.util.*;

import javax.swing.*;

public class TestPanel extends JPanel{

Point a,b,c,d;

Shape trapezium,parallelogram;

Random random=new Random();

public TestPanel(){

a=new Point();

b=new Point();

c=new Point();

d=new Point();

rhombusFactory(a,b,c,d);

trapezium=getQuadrilateral(a,b,c,d);

}

private void rhombusFactory(Point a,Point b,Point c,Point d)

{ int width=random.nextInt(200-100)+100;

int height=random.nextInt(150-50)+50;

a.x=0;

a.y=0;

b.x=a.x+width/2;

b.y=a.y+height/2;

c.x=a.x+width;

c.y=a.y;

d.x=a.x+width/2;

d.y=a.y-height/2;

}

private void parallelogramFactory(Point a,Point b,Point c,Point d){

int l1=random.nextInt(200-100)+100;

int l2=random.nextInt(150-70)+70;

int offset=(random.nextInt(2)==0?-1:1)*(random.nextInt(50-20)+20);

a.x=0;

a.y=0;

b.x=a.x+l1;

b.y=a.y;

d.x=a.x+offset;

d.y=a.y+l2;

c.x=d.x+l1;

c.y=d.y;

}

private Shape getQuadrilateral(Point a,Point b,Point c,Point d){

GeneralPath gp=new GeneralPath();

gp.moveTo(a.x,a.y);

gp.lineTo(b.x,b.y);

gp.lineTo(c.x,c.y);

gp.lineTo(d.x,d.y);

gp.closePath();

return gp;

}

private void drawShape(Graphics2D g,Shape shape){

AffineTransform oldt=g.getTransform();

Rectangle2D bounds=shape.getBounds2D();

double height=bounds.getHeight();

double width=bounds.getWidth();

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));

g.translate(this.getWidth()/2,this.getHeight()/2);

g.translate(-width/2,-height/2);

g.draw(shape.getBounds2D());

g.draw(shape);

g.setTransform(oldt);

}

public void paintComponent(Graphics g2){

super.paintComponent(g2);

Graphics2D g=(Graphics2D)g2;

drawShape(g,trapezium);

//drawShape(g,parallelogram);

}

public static void main(String args[]){

JFrame jf=new JFrame();

TestPanel tp=new TestPanel();

jf.setLayout(new BorderLayout());

jf.add(tp,BorderLayout.CENTER);

jf.setSize(500,500);

jf.setVisible(true);

}

}

任何帮助,将不胜感激

编辑:

我只是从代码中删除了混乱的行...

参考方案

您需要考虑Shape的有界x / y位置:

Rectangle bounds=shape.getBounds(); // changed this

...

//g.translate(this.getWidth()/2,this.getHeight()/2);

//g.translate(-width/2,-height/2);

g.translate((this.getWidth() - width) / 2,(this.getHeight() - height) / 2);

g.translate(-bounds.x, -bounds.y); // added this

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。Java swing-事件触发后,我可以在选项卡上更改名称吗? - java

一,代码:tab_textArea_file.addTab(docLabel, null, scrollPane_textArea, null); 因此,情况是我有一个可供用户选择的文件列表。用户单击文件时,将读取文件的内容并将其加载到textArea中。 “ docLabel”(在上面的代码中)是应该更改为所选文件名的字符串,但并非如此。是否可以通过上面的…Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值