2016-09-28 76 views
-1

我正在创建Swing应用程序。这是一种与移动对象应用程序的路线图。我把我的形状组件分成两个JPanel s。一个是静态组件JPanel,第二个是动态组件JPanel,并且都添加到mainPanel中。两个面板都是重叠的,而对于动态组件面板来说,不透明是错误的以使其透明。当我为动态组件面板重新绘制时,它也会触发重新绘制静态组件面板。如果动态组件面板的形状发生变化并且静态组件面板形状不应该被擦除,我不想每次重新绘制静态组件面板。在重叠面板上绘制图形,一个面板绘制固定和另一个绘制可移动

目前我的逻辑如下。这是伪代码。 请帮助我如何绘制静态组件的可移动组件顶部,并在启动时绘制静态组件。

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()来执行动画。如果您想要动画,请使用Swing Timer安排重新绘制。