2012-11-01 38 views
0

調用與任何類型的轉變 重繪時,我有幾個問題如:g2D.scale(1.1,1.1) 見代碼示例 與重繪沒有問題(),但如果你調用重繪(x,y,w,h)重新繪製所有梨形並且 不起作用。 你如何解決這個問題?的Java重繪()發出

import javax.swing.SwingUtilities; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.BorderFactory; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseMotionListener; 
import java.awt.event.MouseMotionAdapter; 

public class RepaintDemo { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() { 
     JFrame f = new JFrame("Swing Paint Demo"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new MyPanel()); 
     f.setSize(400,400); 
     f.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 

    private int squareX = 50; 
    private int squareY = 50; 
    private int squareW = 20; 
    private int squareH = 20; 

    public MyPanel() { 

     setBorder(BorderFactory.createLineBorder(Color.black)); 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       moveSquare(e.getX(),e.getY()); 
      } 
     }); 

     addMouseMotionListener(new MouseAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       moveSquare(e.getX(),e.getY()); 
      } 
     }); 

    } 

    private void moveSquare(int x, int y) { 
     int OFFSET = 1; 
     if ((squareX!=x) || (squareY!=y)) { 
      repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
      squareX=x; 
      squareY=y; 
      repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
     } 
    } 


    protected void paintComponent(Graphics g) { 
     super.paintComponent(g);  
     Graphics2D g2D = (Graphics2D)g; 
     g2D.scale(1.1,1.1); 
     g.setColor(Color.RED); 
     g.fillRect(squareX,squareY,squareW,squareH); 
     g.setColor(Color.BLACK); 
     g.drawRect(squareX,squareY,squareW,squareH); 
    } 
} 
+4

你不應該做的圖形的變換對象給你的paintComponent方法由JVM進行。首先製作一個Graphics對象,然後轉換*那個*,然後用它繪製,然後處理它。否則,當JVM將該Graphics對象傳遞給子組件時,您將面臨嚴重的副作用。 –

回答

1

如何像

if ((squareX!=x) || (squareY!=y)) { 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
     squareX=x; 
     squareY=y; 
     repaint(squareX+x,squareY+y,squareW+x+OFFSET,squareH+y+OFFSET); 
} 

很明顯,你可以修改和完善行爲accroding您的特定需求