我想把一个椭圆形涂在另一个椭圆形上。 这里我使用select语句在paint组件方法中绘制。
import java.awt.*;
public class test extends JPanel{
public static final int OVAL = 1;
public static final int SOLID = 2;
private int type = LINE;
public test(int type){
this.type = type;
}
public void piantComponent(Graphics g){
super.paintComponent(g);
switch(type)
{
case OVAL:
g.setColor(Color.YELLOW);
g.drawOval(0,0,150,150);
break;
case SOLID:
g.setColor(Color.BLUE);
g.fillOval(0,0,50,50);
break;
}
}
}
现在在我的主要方法中,我想在黄色椭圆形(OVAL)内显示一个纯蓝色椭圆形(SOLID)。
import...;
public class Main{
public static void main (String [] args){
JFrame window = new JFrame();
window.add(new test(test.OVAL));
window.add(new test(test.SOLID));
window.setSize(300,300);
window.setVisible(true);
}
}
这根本不是我想做的事情。这只显示一个椭圆形而不是椭圆形和实心。我认为我超载窗口只显示椭圆形。我试图用布局管理器(gridlayout)进行显示,但是这两个画面并没有显示出彼此相邻的两幅画作。
如何在不丢失switch语句的情况下解决此问题。
答案 0 :(得分:1)
public class test{
(使用正确的命名惯例并将test
更改为Text
)不包含任何JComponents
使用JPanel
或普通JComponent
在AWT中绘画,默认情况下,Swing永远不会返回PreferredSize
,然后容器为零Dimension
,required to override getPreferredSize
答案 1 :(得分:1)
window.add(new test(test.OVAL));
window.add(new test(test.SOLID));
您的问题与ZOrder有关。为简化起见,Swing以与面板上相反的顺序绘制组件。因此,在您的情况下,SOLID会在OVAL之前绘制。由于OVAL的尺寸较大,因此它涵盖了SOLID。
您可以通过执行以下操作强制Swing以更直观的顺序绘制组件:
window.add(0, new test(test.OVAL));
window.add(0, new test(test.SOLID));
现在添加的最后一个组件也将最后绘制。
然而,更好的设计是创建单独的Oval和Solid类,以便您可以独立指定大小,位置和颜色。然后,您可以根据需要为面板添加任意数量的组件。
答案 2 :(得分:1)
import java.awt。*;
public class test扩展了JPanel {
public static final int OVAL = 1;
public static final int SOLID = 2;
**public static final int BOTH = 3;** //instance variable to represent the
//painting of both images
private static int type;
public test(int type){
this.type = type;
}
public void paintComponent(Graphics g){
switch(type)
{
case OVAL:
g.setColor(Color.BLACK);
g.drawOval(0,0,150,150);
break;
case SOLID:
g.setColor(Color.BLUE);
g.fillOval(0,0,50,50);
break;
case BOTH: //statements to draw both figures
g.setColor(Color.BLACK);
g.drawOval(0,0,150,150);
g.setColor(Color.BLUE);
g.fillOval(0,0,50,50);
break;
}
}//paint component
}
在主要方法中使用
window.add(新测试(test.BOTH);
答案 3 :(得分:0)
为什么不一个接一个地画一个?像那样:
g.setColor(Color.YELLOW);
g.drawOval(0,0,150,150);
g.setColor(Color.BLUE);
g.fillOval(0,0,50,50);
答案 4 :(得分:0)
尝试这样的事情(仅使用代码段):
private ArrayList<int> ovals = new ArrayList<int>();
public test(int type) {
ovals.add(type);
}
public void piantComponent(Graphics g)
{
super.paintComponent(g);
for(int oval : ovals)
{
switch(type)
{
case OVAL:
g.setColor(Color.YELLOW);
g.drawOval(0,0,150,150);
break;
case SOLID:
g.setColor(Color.BLUE);
g.fillOval(0,0,50,50);
break;
}
}
}
这将允许您根据需要添加任意数量的椭圆(虽然它们的静态定位只会在画布上添加它们)。您可以尝试使用布尔数组并迭代它以查看是否需要绘制特定类型(如果您只需要1个)。