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…
總結
以上是生活随笔為你收集整理的java panel 左对齐,将Shape的中心与JPanel的中心对齐 - java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中 可替代curl,laravel
- 下一篇: mod php是什么意思,mod_php