2013-03-16 175 views
2

我正在製作一個程序,您可以在其中單擊一個包含圖像的JLabel,並且圓圈將出現在JLabel上。這在我的macintosh/java6上完美無瑕,但是當我使用windows/java7的 時,會發生各種奇怪的事情。在圖像的某些部分,您不能繪製一個圓圈 。這就像圖片中間的一個看不見的廣場。有時候,這個圈子會消失,並在不同的時間回來。 每次我畫一個新的圈子,所有的圈子都在標籤的頂部重繪。Java圖形行爲奇怪

public void paint(JComponent label) { 
    Graphics g = label.getGraphics(); 
    for (T node : nodes.keySet()) { 
     Point p = nodes.get(node); 
     Color color; 
     if (p.selected) { 
      color = Color.RED; 
     } else { 
      color = Color.BLUE; 
     } 
     g.setColor(color); 
     g.fillOval(p.x, p.y, circleRadius*2, circleRadius*2); 
     g.setColor(Color.BLACK); 
     g.setFont(new Font("Helvetica", 20, 20)); 
     g.drawString((String) node, p.x, p.y); 
    }  
} 

有誰知道是什麼原因造成的?

+3

使用'public void paintComponent(final Graphics g)'。你必須重寫它。 – 2013-03-16 22:39:55

+0

爲了儘快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-03-17 00:08:28

+0

在做圖形編程之前,你需要閱讀教程,因爲它需要拋出一些舊的假設。 – 2013-03-17 00:47:38

回答

5

從不使用的getGraphics(),它可以返回空值充其量是最後的油漆週期

的快照一旦將被刪除

相反,作爲一個重繪發生什麼畫吧聯想已經暗示,自己創建一個自定義標籤,並重寫paintComponent,並執行你的畫在這裏

記住,繪畫是無狀態的,這意味着每個重繪,你必須重建你的狀態

看看Custom painting

0

移除你的paint(JComponent j);方法並嘗試使用以下JLabel。 根據需要進行調整以滿足您的需求。

final JLabel jLabel = new JLabel("!X!") { 
    @Override 
    public void paintComponent(final Graphics g) { 
     super.paintComponent(g); 
     for (T node : nodes.keySet()) { 
      Point p = nodes.get(node); 
      Color color; 
      if (p.selected) { 
       color = Color.RED; 
      } else { 
       color = Color.BLUE; 
      } 
      g.setColor(color); 
      g.fillOval(p.x, p.y, circleRadius*2, circleRadius*2); 
      g.setColor(Color.BLACK); 
      g.setFont(new Font("Helvetica", 20, 20)); 
      g.drawString((String) node, p.x, p.y); 
     }    
    } 
}; 
+1

爲你做了一些修改。在超類中'paintComponent'方法是空的,調用該方法將不起作用。此外,您還包含'Graphics g = jlabel.getGraphics()'部分。 – 2013-03-16 22:55:23

+0

@Legend你是。正在修復... – Java42 2013-03-16 22:57:03

+0

@Legend我對你的建議感到困惑,'super.paintComponent'是空的/沒有任何作用。它負責爲繪畫準備Graphics上下文,對於JLabel來說,這非常重要,因爲它是透明的。不這樣做可能會導致令人討厭的油漆文物... – MadProgrammer 2013-03-17 05:20:46