绘制对象之上的对象

时间:2013-04-08 13:16:56

标签: java swing java-2d paintcomponent paint

我想把一个椭圆形涂在另一个椭圆形上。 这里我使用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语句的情况下解决此问题。

5 个答案:

答案 0 :(得分:1)

    具体Painting in Swing

    必须完成
  • JComponent

  • public class test{(使用正确的命名惯例并将test更改为Text)不包含任何JComponents

  • 使用JPanel或普通JComponent

  • 在AWT中绘画,默认情况下,Swing永远不会返回PreferredSize,然后容器为零Dimensionrequired 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)

  1. 测试类中的修改。阅读评论以解释修改
  2. 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
    

    }

    1. 在主要方法中使用

        
          

      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个)。