2013-04-12 77 views
0

通常当我想拍的动画,我通过绘制矩形重置所有图形画面:如何在transperant JFrame上使用paintComponent重置图形?

@Override 
public void paintComponent(Graphics g) { 
    g.setColor(Color.white); 
    g.fillRect(0,0,1000,1000); 

    // now im drawing the animation on empty screen 
} 

后,我drawed的矩形我可以画空白屏幕上的动画,因此动画会移动,而不是传播。现在我想在Transparent JFrame上绘制动画。如何从Precedings图纸中清空组件,并仍然保持JFrame传输?

回答

2
  1. 确保你的元件都是非不透明
  2. 对于透明度的工作,只要你愿意,你不需要做的事情paintComponent()(尤其是不填充白色矩形)
  3. 重置所有内容,设置标志或条件并调用repaint()。在paintComponent()中,检查该标志或条件,如果为true,则不要绘制任何东西。

这里是一个半透明框架的小演示,它在鼠标移动的任何地方绘制一条线。无论你何时点击框架,它都会删除所有内容。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestTransparentFrame { 

    private class PaintPanel extends JPanel { 
     private List<Point> points = new ArrayList<Point>(); 

     public PaintPanel() { 
      setOpaque(false); 
      MouseAdapter adapter = new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        points.clear(); 
        repaint(); 
       } 

       @Override 
       public void mouseMoved(MouseEvent e) { 
        points.add(e.getPoint()); 
        repaint(); 
       } 
      }; 
      addMouseListener(adapter); 
      addMouseMotionListener(adapter); 
      setBorder(BorderFactory.createLineBorder(Color.GREEN)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (points.size() > 1) { 
       g.setColor(Color.RED); 
       Point p1 = points.get(0); 

       for (int i = 1; i < points.size(); i++) { 
        Point p2 = points.get(i); 
        g.drawLine(p1.x, p1.y, p2.x, p2.y); 
        p1 = p2; 
       } 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(700, 500); 
     } 
    } 

    protected void createAndShowGUI() throws MalformedURLException, IOException { 
     JFrame frame = new JFrame("Test transparent painting"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setUndecorated(true); 
     frame.setBackground(new Color(0, 0, 0, 50)); 
     frame.add(new PaintPanel()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        new TestTransparentFrame().createAndShowGUI(); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

    } 

} 
相关问题