[英]Understanding paintComponent
更新 19/01/14(對於有類似問題的人)
我在下面描述的問題源於我的 circle 類擴展了 JPanel。 所以我從這個類創建的每個圓圈實際上都是它自己的面板。 因此,通過添加布局,我可以看到兩個圓圈。 我現在了解到,它有一個單獨的“板類”來擴展 JPanel,在這種情況下,讓圓圈不擴展任何東西。 這樣我就可以在 circleclass 中實現一個 drawMySelf 方法並在我的板上繪制它們。 這樣我就可以在同一個面板中擁有各種幾何對象!
更新結束。
我正在做一個需要畫兩個圓圈的任務。 當我調整框架大小時,這些圓圈應該隨機重新定位。 並且需要在它們的中心之間有一條線來說明距離。 我的圈子課遇到了麻煩。 當我將我的自定義圓圈添加到我的測試程序時,只會出現其中一個。 我不明白為什么。 我認為我的代碼中有一個錯誤,使程序跳過了其中的一些。 因為我只會出現一個圓圈。 誰能看出這段代碼有什么問題?
請記住,我應該使用到目前為止所學的工具。 JPanel、JFrame、覆蓋paintComponent()。
圓圈類:
package oppgave4;
import javax.swing.*;
import java.awt.*;
public class Circle extends JPanel {
public static final int OVAL = 1;
public static final int ANOTHEROVAL = 2;
public int OVALCENTER = 0;
public int ANOTHEROVALCENTER = 0;
private int type = 1;
private boolean filled = false;
public Circle(){
}
public Circle(int type){
this.type = type;
}
public Circle(int type, boolean filled){
this.type = type;
this.filled = filled;
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
int randomWidth = (int)(width * Math.random());
int randomHeight = (int)(height * Math.random());
switch (type){
case OVAL:
g.setColor(Color.BLUE);
if(filled)
g.fillOval(randomWidth, randomHeight, 30, 30);
else
g.drawOval(randomWidth, randomHeight, 30, 30);
case ANOTHEROVAL:
g.setColor(Color.RED);
if(filled)
g.fillOval(randomWidth, randomHeight, 30, 30);
else
g.drawOval(randomWidth, randomHeight, 30, 30);
break;
}
}
}
和測試程序:當我運行它時,只會出現紅色圓圈。
package oppgave4;
import javax.swing.*;
import java.awt.*;
public class TestProgram extends JFrame {
public TestProgram(){
add(new Circle(Circle.OVAL));
add(new Circle(Circle.ANOTHEROVAL));
}
public static void main(String[] args) {
TestProgram sirkel = new TestProgram();
sirkel.setSize(400, 300);
sirkel.setLocationRelativeTo(null);
sirkel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sirkel.setVisible(true);
}
}
首先,通過使每個Circle
成為JPanel
,您將獲得意想不到的結果,因為兩個JPanels
不能繪制到同一個地方。 相反,它們被放置在我的 LayoutManager 中。 在這種情況下,我會想象你的一個面板在另一個面板的頂部,所以你只能看到一個。
如果您希望圓圈位於同一個“面板”中(它們可以重疊),那么您將需要一個可以繪制多個圓圈的JPanel
。
如果您希望它們在單獨的面板中“並排”,我會查看GridLayout
嘗試使用除默認 BorderLayout 之外的布局管理器添加它們,看看會發生什么
import java.awt.*;
public TestProgram(){
setLayout(new GridLayout(1, 2);
add(new Circle(Circle.OVAL));
add(new Circle(Circle.ANOTHEROVAL));
}
另一種解決方案是使用JFrame
的默認BorderLayout
。 當您只是.add(something)
,它會自動添加到BorderLayout.CENTER
,除非您指定位置。 一個 BorderLayout 並且每個位置只包含一個組件。 因此,當您嘗試添加第二個時,只有第二個會出現在CENTER
位置。
如果你做了
public TestProgram(){
setLayout(new GridLayout(1, 2);
add(new Circle(Circle.OVAL), BorderLayout.CENTER);
add(new Circle(Circle.ANOTHEROVAL), BorderLayout.SOUTH);
}
它也可以工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.