2016-09-28 4 views
-1

스윙 어플 리케이션을 만들고 있습니다. 움직이는 물체를 응용 한 도로지도의 일종입니다. 내 모양 구성 요소를 두 개의 JPanel으로 나눕니다. 하나는 정적 구성 요소 JPanel이고 다른 하나는 동적 구성 요소 JPanel에 대한 것이며 둘 다 mainPanel에 추가됩니다. 두 패널이 겹쳐져 있으며 동적 구성 요소 패널의 경우 불투명도가 false이므로 패널을 투명하게 만듭니다. 동적 구성 요소 패널에 대해 다시 칠할 때 정적 구성 요소 패널에 대한 다시 칠하기를 트리거합니다. 동적 구성 요소 패널의 모양이 변경되고 정적 구성 요소 패널 모양이 지워져서는 안될 때마다 정적 구성 요소 패널을 다시 칠하고 싶지 않습니다.겹쳐진 패널에 도형 그리기, 고정 패널 그리기 고정 그리기 및 다른 그리기 이동 가능

현재 내 논리는 다음과 같습니다. 의사 코드입니다. 시작시 가동 부품을 맨 위에 그리는 방법과 정적 부품을 한 번 그리는 방법을 알려주십시오.

public class layeredpanel extends JFrame 
{ 

    private JPanel contentPane; 


    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        layeredpanel frame = new layeredpanel(); 
        frame.setVisible(true); 
       } catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public layeredpanel() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 

     panel.setLayout(new OverlayLayout(panel)); 


     final JPanel layer_1 = new layer1(); 

     layer_1.setOpaque(false); 
     panel.add(layer_1); 


     JPanel layer_2 = new layer2();  
     panel.add(layer_2); 


     Thread thread = new Thread(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       while(true) 
       {try 
       { 
        Thread.sleep(500); 
       } catch (InterruptedException e) 
       { 

        e.printStackTrace(); 
       } 

       layer_1.repaint(); 
      } 
      } 
     }); 

     thread.start(); 



    } 

    class layer1 extends JPanel 
    { 


     @Override 
     public void paintComponent(Graphics g) 
     { 
      // TODO Auto-generated method stub 
      super.paintComponent(g); 
      System.out.println("Paint1"); 
      g.setColor(Color.blue); 
      g.drawRect(30, 20, 40, 40); 
     } 

    } 

    class layer2 extends JPanel 
    { 
     @Override 
     public void paintComponent(Graphics g) 
     { 
      System.out.println("Paint2"); 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 

     g.setColor(Color.green); 
     g.fillRect(30, 20, 20, 20);} 

    } 
} 

출력 : Paint2

Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 
Paint2 
Paint1 

답변

1

이 길 스윙 페인팅 작품이다. 투명한 패널이있는 경우 페인팅 아티팩트가 없는지 확인하기 위해 부모 패널을 채워야합니다.

당신이 할 수 부모 패널의 그림을보다 효율적으로 만들려면 :
  1. 가에 그림을 수행합니다 BufferedImage 첫 번째 (당신이 당신의 클래스를 만들 때) 다음 바로 BufferedImage를 다시 칠.
  2. 위쪽 패널을 다시 칠할 때 repaint(....)을 사용하여 다시 그리기 할 사각형 영역을 지정할 수 있습니다. 그런 다음 상위 패널의 해당 부분 만 다시 칠합니다.

또한 Thread.sleep()이있는 Thread를 사용하여 애니메이션을 수행하지 마십시오. 애니메이션을 원하면 Swing Timer을 사용하여 다시 그리기를 예약하십시오.