2014-05-04 21 views
-2

我一直在試圖在最後兩天在我的JPanel上繪製對象。當我試圖在JPanel上繪製對象時,代碼正在運行,當它未放置在JTabbedPane中時。但現在對我來說太忙了。請幫助我。在JPanel上繪製對象放置在JTabbedPane

MouseMotionListener

panel[i].addMouseMotionListener(this); 

加入面板註冊JPanelJTabbedPane

tp.addTab("Tab1",panel[i]); 

mouseDragged事件具有以下代碼

public void mouseDragged(MouseEvent e) { 
    x = e.getX(); 
    y = e.getY(); 
    repaint(); 
} 

事件的mouseReleased

public void mouseReleased(MouseEvent e) { 
    x1 = e.getX(); 
    y1 = e.getY(); 
    repaint(); 
} 

塗料功能(即必須被自動調用)具有以下線

public void paint(Graphics g) 
{ 
    super.paint(g); 
    // I even tried to add the following line but it didn't work too 
    /// g=panel[tp.getSelectedIndex()].getGraphics(); 
    Graphics2D gtd=(Graphics2D) g; 
    gtd.fillOval(x, y, x1-x, y1-y); //x1-x: For width of Oval; y1-y: for height 
} 
+2

發佈[MCVE(鏈接)](http://stackoverflow.com/help/mcve)。 – user1803551

+2

不要重寫'paint',否則重寫'paintComponent'。 – user1803551

+0

請參見[相關](http://stackoverflow.com/a/23183787/2587435) –

回答

1

X1和Y1將總是等於x和y的,因爲鼠標釋放總是發生在(或非常接近)的位置最近的鼠標拖動。這意味着你的橢圓的寬度總是爲零,高度爲零。

如果您的目標是創建一個橢圓形的用戶拖動的區域大小,則必須保存mousePressed事件的位置。然後你應該在mouseDragged中更新對角(在你的情況下是x1和y1)。

您不應該更新mouseReleased事件中的任何座標。相反,你應該保留一個布爾標誌(在一個私人字段中),表明拖動正在進行中。當mousePressed發生時將其設置爲true,並在發生mouseReleased時將其設置爲false。你的mouseDragged方法只應該在設置該標誌時更新橢圓的座標。

+0

我還添加了mousePrssed事件。對不起,我錯過了那個代碼。 public void mousePressed(MouseEvent e){x = e.getX(); y = e.getY(); repaint(); }但它沒有效果。我只是從JPanel中創建了另一個類並複製了相同的代碼,它在那裏工作。感謝您的時間回答我.. :) – user3274506