2012-05-29 30 views
1

我正在製作一個繪圖板,而且我有幾個問題。當使用drawRect時圖形太慢了

  1. 每當我嘗試繪製它,它不會自動更新。廣告我通常不得不調整屏幕的大小以便更新。
  2. 我該如何做一些類似於mouseDragged的函數,我可以不斷地獲取x和y座標?

下面是代碼:

import java.awt.geom.*; 
class griddedInput extends JComponent implements MouseListener 
{ 
    int SIZE = 10; 
    int scSize = 300; 
    int sSize = scSize/SIZE; 
    boolean [][] grid = new boolean[sSize][sSize]; 
    public griddedInput(boolean grid[][]) 
    { 
     grid=grid; 
     setPreferredSize(new Dimension(scSize,scSize)); 
     addMouseListener(this); 
    } 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     int x, y; 
     for(y = 0; y < sSize; y ++) { 
      for(x = 0; x < sSize; x ++) { 
       if(grid[y][x]) 
        g2.setColor(Color.BLACK); 
       else 
        g2.setColor(Color.WHITE); 
       g2.fillRect((x * SIZE), (y * SIZE), sSize, sSize); 
      } 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     int squareX = (int)e.getX()/SIZE; 
     int squareY = (int)e.getY()/SIZE; 
     grid[squareY][squareX] = !grid[squareY][squareX]; 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 
} 
+0

請爲代碼塊使用一致的邏輯縮進。 –

回答

1

你要打電話repaint()繪圖組件要建議的JVM,它被塗任何時間 - 最有可能在你的MouseListener方法(S)。

例如,

@Override 
public void mouseClicked(MouseEvent e) { 
    int squareX = (int)e.getX()/SIZE; 
    int squareY = (int)e.getY()/SIZE; 
    grid[squareY][squareX] = !grid[squareY][squareX]; 
    repaint(); 
} 

要加快重畫,你也可以調用重載方法,使您可以重新繪製你的GUI的選擇長方形的,但我敢打賭,你不需要做對於這個GUI。

如果您希望其他人能夠更好地理解它併爲您提供幫助,那麼您還需要減少代碼縮進的「創意」。

編輯
關於:

2.How我可以這樣做一個的mouseDragged功能,我可以不斷地得到x和y COORDS?

另外添加一個MouseMotionListener。它可以是同一個類,實際上我通常使用一個匿名內部類來實現這個功能,一個擴展MouseAdapter,另一個使用MouseListener和MouseMotionListener的單一實例。我在這個論壇有幾個帖子使用這個例子。

+2

@ user1377835:您的縮進遍佈各處,使我們很難邏輯地遵循您的代碼。如果您的代碼使用標準的常規縮進更容易閱讀,我們將能夠更好地爲您提供幫助,這意味着您可以在此獲得更好的更快答案。我們會感謝您爲使我們更輕鬆的努力。 –

+0

怎麼樣像mousedrag監聽器。謝謝,你的建議真的幫了大忙! – Barakados

+0

@ user1377835:請參閱編輯以回答。 –

1

我會有點不同結構的本:

private BufferedImage bi = new BufferedImage(getWidth(), getHeight()); 
private Graphics2D big = bi.createGraphics(); 

public void paintComponent(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.drawImage(bi, 0, 0, this); 
} 

@Override 
public void mouseClicked(MouseEvent e) { 
    int squareX = (int)e.getX()/SIZE; 
    int squareY = (int)e.getY()/SIZE; 
    boolean b = !grid[squareY][squareX]; 
    grid[squareY][squareX] = b; 
    if(b) 
     big.setColor(Color.BLACK); 
    else 
     big.setColor(Color.WHITE); 
    big.fillRect((x * SIZE), (y * SIZE), sSize, sSize); 
    repaint(); 
} 

mouseClicked執行單fillRectpaintComponent單個drawImage。將其與每次重繪時執行 fillRects的原始代碼進行比較。

您還需要檢測尺寸的更改並在當時重新創建BufferedImage