我一直在尝试将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…

java panel 左对齐,将Shape的中心与JPanel的中心对齐 - java相关推荐

  1. java panel 左对齐,JPanel左对齐

    我测试了下,把你的panel1.setAlignmentX(JPanel.LEFT_ALIGNMENT);改为 panel1.setLayout(new FlowLayout(FlowLayout.L ...

  2. 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出。...

    编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 题目描述 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 输入描述 编写程序输入一个5x5的矩阵 ...

  3. align latex 使用_latex中使用listings时如何使matlab代码块居左而非居中,最好与上面的文本对齐...

    ## 编译环境 操作系统 * [x] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [ ] TexLive `年份 ...

  4. java panel 所有事件_java-侦听/处理JPanel事件

    先生们女士们晚上好, 我有一个Java Swing无法解决的问题,也许您可​​以帮助我.这里是: >我有一个使用BorderLayout的JFrame和许多JPanels. >每当我需要建 ...

  5. java jtextfield 居中_有什么办法可以使JFrame的中心居中吗? - java

    我有自己的主框架和当有人选择菜单项时弹出的两个JDialogs.我想要的是一个带有一些规则,建议等的"帮助"对话框. setLayout(null)和Toolkit / Dimen ...

  6. Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)

    Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP) 说明:在微服务生鲜电商用户中心的系统设计中,我一直强调一个观点,就是你这个系统使用用户到底是TO B的还是TO C的呢?这个是 ...

  7. Java 深度历险(作者成富,是IBM 中国软件开发中心的高级工程师)

    Java 深度历险(作者成富,是IBM 中国软件开发中心的高级工程师)  http://blog.csdn.net/hnzhangshilong/article/details/7038009 2  ...

  8. java jdk 7_jdk1.7下载|Java Development Kit (JDK) 下载「64位」-太平洋下载中心

    使用方法: 一.jdk1.7环境怎么配置? 1.右键计算机-->属性-->高级系统设置-->环境变量 jdk下载截图10 jdk下载截图11 2.在系统变量中新建 变量名:JAVA_ ...

  9. java 截取byte数组_2020年的秋招已经开始了!最新Java面试题大全(文末附参考答案)送给大家...

    包含的模块 本文分为十九个模块,分别是:Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring ...

最新文章

  1. C语言程序设计 细节总结(第1-7章)
  2. 首颗“机器心”成功植入近四十年后,人造心脏终于又迎来颠覆变革
  3. DL之FAN:FAN人脸对齐网络(Face Alignment depth Network)的论文简介、案例应用之详细攻略
  4. sringboot security基本用法
  5. mysql join性能_Mysql Join语法解析与性能分析
  6. 开源硬件 可穿戴_11个出色的可穿戴开源项目
  7. python线程池回调函数_python回调函数中使用多线程的方法
  8. 关于对网络学习方法的一点见解
  9. Windows常用密码的破解方法
  10. ITIL事件管理流程设计
  11. netlogo-入门-学习记录
  12. MIUI刷Android原生,小米手机怎么刷安卓原生系统
  13. 解决 Permission denied: user=root, access=WRITE, inode=“/user“:hdfs:supergroup:drwxr-xr-x
  14. python saveas_如何使用Python SaveAs对话框
  15. python中实现简单抽样的函数
  16. 二分查找--天堂珍珠(珍珠项链)pearl
  17. 国内外RTI产品调查情况(转)
  18. 4G全网通模块 高通骁龙410系列-MSM8916(M9+) Cortex-A53架构
  19. 阿里云oos对象存储 上手快速入门
  20. 什么是哈希冲突?如何解决?

热门文章

  1. org/springframework/core/MethodClassKey
  2. HTML5拖放(drag and drop)与plupload的懒人上传
  3. Linux:终端自定义title
  4. Ubuntu14.04 + Matlab2014a + caffe + cuda + cudnn环境搭建
  5. Oracle调用webservice说明
  6. 国内外常用Linux服务器控制面板介绍
  7. 大话设计模式Python实现-简单工厂模式
  8. mysql恢复root密码
  9. Ionic2中集成第三方控件Sweetalert
  10. java.sql.SQLException: 关闭的 Resultset: next