2013-12-20 84 views
0

背景: 我正在製作一個「字典」或類似於「畫東西」的多人遊戲。不斷重繪問題

問題: 當我畫手繪它不斷調用repaint()。當我按下按鈕並單擊jpanel時,該按鈕在jpanel上重新繪製或重繪。

代碼:

public class DrawP extends JPanel implements MouseListener, MouseMotionListener{ 
private int x1; 
private int y1; 
private int cx,cy; 

public DrawP(){ 
    super(); 
    JFrame fr = new JFrame("Test"); 

    JButton btn = new JButton("Test"); 

    fr.setSize(500, 500); 
    Container c = fr.getContentPane(); 
    c.add(btn, BorderLayout.SOUTH); 
    c.add(this); 
    this.addMouseListener(this); 
    this.addMouseMotionListener(this); 
    fr.setVisible(true); 
    c.validate(); 
    c.repaint(); 
} 

public void paintComponent(Graphics g){ 
    super.paintComponents(g); 
    g.drawLine(cx, cy, x1, y1); 
} 
@Override 
public void mouseDragged(MouseEvent e) { 
    x1 = e.getX(); 
    y1 = e.getY(); 
    cx = x1; 
    cy = y1; 
    repaint(); 
} 

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

} 

@Override 
public void mouseClicked(MouseEvent e) { 
    // TODO Auto-generated method stub 
    cx = e.getX(); 
    cy = e.getY(); 
    x1 = cx; 
    y1 = cy; 
    repaint(); 
} 

@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 

} 

public static void main (String [] args){ 
    DrawP d = new DrawP(); 

} 
} 

此圖爲後,我按一下按鈕,繪製發生了什麼: http://imgur.com/o9QCTjF

+2

對不起,但我不明白你想要發生,不想發生。你能解釋得更清楚嗎? –

+0

它不是Java 8,是嗎? –

+0

我想繪製就像你可以畫在油漆上。並停止按鈕重新出現在jpanel中。 – user3123062

回答

1
super.paintComponent's'(g); 

看起來你有一個錯字。你不希望paintComponent(...)中的「s」;

c.validate(); 
c.repaint(); 

此外,你不需要上述兩行。當框架可見時,框架將重新生效並繪製。使用revalidate()和repaint()方法的唯一時間是從可見GUI添加/刪除組件。

編輯:

只顯示應用點

如果你想要做增量繪畫然後例如兩種常見的方法來做到這一點看看Custom Painting Approaches

  1. 使用列表跟蹤所有要繪製的線條
  2. 直接繪製到Buff上eredImage。
+0

「s」可以讓我畫畫,就像你用鉛筆畫畫一樣。如果我沒有「s」,那麼我不能繪製 - 它只在應用程序上顯示一個點 – user3123062

+0

您不應該使用paintComponents(),這不是Swing設計的方式,因爲您可以從您遇到的問題有。請參閱編輯。 – camickr