更新19/01/14(针对有类似问题的人)
下面我描述的问题源于我的循环类扩展了JPanel这个事实。因此,我从这个类创建的每一个圆实际上都是它自己的面板。因此,通过添加一个布局,我可以看到两个圆圈。我现在已经了解到,更明智的做法是拥有一个单独的"board类“来扩展JPanel,在这种情况下,让圆不扩展任何东西。这样,我就可以在循环中实现一个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);
}
}发布于 2013-11-09 15:27:47
尝试将它们添加到默认的BorderLayout之外的布局管理器中,看看会发生什么
import java.awt.*;
public TestProgram(){
setLayout(new GridLayout(1, 2);
add(new Circle(Circle.OVAL));
add(new Circle(Circle.ANOTHEROVAL));
}另一个解决方案就是使用JFrame的默认JFrame。当您只使用.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);
}它也能起作用
发布于 2013-11-09 15:27:09
首先,通过使每个Circle成为一个JPanel,您将得到意想不到的结果,因为两个JPanels不能绘制到相同的位置。相反,他们把我的LayoutManager。在这种情况下,我可以想象你的一个面板在另一个面板上,所以你只看到一个面板。
如果您希望圆圈位于同一个“面板”(它们可以重叠),那么您将需要一个JPanel,它可以绘制多个圆圈。
如果您希望它们在单独的面板中“并排”,我会查看GridLayout。
https://stackoverflow.com/questions/19877365
复制相似问题