2

我正在尝试在另一个椭圆上画一个椭圆。这里我使用一个 select 语句来绘制绘制组件方法。

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 语句的情况下解决此问题。

4

5 回答 5

1
于 2013-04-08T13:48:02.407 回答
1
window.add(new test(test.OVAL));
window.add(new test(test.SOLID));

您的问题与 ZOrder 有关。为简化起见,Swing 以与面板上相反的顺序绘制组件。因此,在您的情况下,固体在椭圆形之前被涂漆。由于 OVAL 的尺寸较大,它覆盖了 SOLID。

您可以通过执行以下操作强制 Swing 以更直观的顺序绘制组件:

window.add(0, new test(test.OVAL));
window.add(0, new test(test.SOLID));

现在最后添加的组件也将最后绘制。

然而,更好的设计是创建单独的 Oval 和 Solid 类,以便您可以独立指定大小、位置和颜色。然后,您可以根据需要向面板添加任意数量的组件。

于 2013-04-08T15:21:18.703 回答
1
  1. 在测试类中进行修改。阅读评论以解释修改

导入 java.awt.*;

公共类测试扩展 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

}

  1. 在主要方法中使用

    window.add(新测试(test.BOTH);

于 2013-04-08T15:28:01.650 回答
0

你为什么不一个接一个地画呢?像那样:

  g.setColor(Color.YELLOW);
  g.drawOval(0,0,150,150);
  g.setColor(Color.BLUE);
  g.fillOval(0,0,50,50);
于 2013-04-08T13:23:23.980 回答
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;
           }
      }
 }

这将允许您根据需要添加任意数量的椭圆(尽管它们的静态定位只会在画布上覆盖它们)。您可以尝试使用布尔数组并对其进行迭代,以查看是否需要绘制特定类型(如果您只需要其中一个)。

于 2013-04-08T13:28:58.757 回答