2010-11-01 97 views
1

新的細節:我的JPanel對象從我的主類的actionPerformed事件中調用時不工作的快速重畫問題(Canvas對象)

重繪方法。它在主類ImageViewer的ImageViewer方法內工作,但不能用於此類的actionPerformed方法。

這些是不能正常工作(重繪部分)我的代碼的關鍵部分:

主類:

/** 
* @(#)NeatImageViewer.java 
* 
* NeatImageViewer application 
* 
* @author 
* @version 1.00 2010/11/1 
*/ 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 


public class NeatImageViewer extends JFrame implements ActionListener { 

    GraphicsPanel gp; 

    NeatImageViewer() { 
       //... window components ... 
    } 

    public static void main(String[] args) { 

     NeatImageViewer niv = new NeatImageViewer(); 
     niv.setSize(500,500); 
     niv.setLocationRelativeTo(niv); 
     niv.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
      //... 
       gp = new GraphicsPanel(); 
       gp.img = img; 
       gp.repaint(); //<!--- Not Working! 
       this.add(gp); 
      //... 
    } 

} 

GraphicsPanel類:

/** 
* @(#)GraphicsPanel.java 
* 
* 
* @author 
* @version 1.00 2010/11/1 
*/ 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 


public class GraphicsPanel extends JPanel { 
    BufferedImage img; 

    GraphicsPanel() { 
     super(); 
    } 

    protected void paintComponent(Graphics g) { 
     //paint method isn't executed??? 
     super.paintComponent(g); 
     System.out.println("Paint!"); 
    } 

} 
+0

」不適用於此類的actionPerformed方法。「對我們毫無意義。發佈你的SSCCE(http://sscce.org)來證明問題。 – camickr 2010-11-01 20:16:39

回答

0

在Swing中,您不使用畫布。您可以在JPanel或JComponent上進行自定義繪製,並且如前所述覆蓋paintComponent(...)方法。有關更多信息和工作示例,請參閱Custom Painting上的Swing教程。

另外,使用Swing,不需要創建自定義組件來顯示圖像。您只需使用帶有ImageIcon的JLabel。閱讀「如何使用圖標」部分。

爲所有Swing基礎的教程加書籤。

編輯:

當你將組件添加到一個可見的GUI的基本代碼應該是:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 
+0

謝謝澄清。我對Swing和AWT將它們結合起來感到困惑。但是現在我跟着教程和Im現在使用JPanel,但具有完全相同的pronlem:從actionPerformed方法調用時,repaint不起作用,但在從ImageViewer的ImageViewer方法調用它時起作用。我認爲我還在做錯什麼? – Skyfe 2010-11-01 20:32:10

+0

@Skyfe,請參閱編輯評論。你還沒有發佈SSCCE。 – camickr 2010-11-01 20:53:38

+0

我用我的代碼更新了我的帖子,但是我沒有將其發佈(gp.repaint())方式發佈到我的主帖(在EDIT2下)。 關於add方法,它也可以省略,因爲paintComponent方法實際上並沒有繪製任何東西,但我只是試圖讓它被執行(在對象上使用重繪方法時根本沒有發生) 。 – Skyfe 2010-11-01 20:58:42

1

您必須覆蓋paintComponent(Graphics g)而不是paint(Graphics g)
因此,您發佈的方法應該重命名爲paintComponent

編輯:你有pack()「編你的框架,當你初始化完成?

編輯:當組件不可見時,repaint()方法什麼也不做。所以,你必須先把它添加到JFrame中,框架是pack()。包裝後,不再需要重新粉刷。

+0

我將方法名稱重命名爲paintComponent,但它仍然不起作用 – Skyfe 2010-11-01 19:37:20

+0

當我打包如下框架:niv.pack()時,我得到一個只有標題和菜單欄的窗口,但它仍然不起作用 – Skyfe 2010-11-01 21:27:17

0

(我Skyfe但這樣是不是「登錄」另一個IP和無法評論)

對不起,但我沒有得到什麼問題?

我提供了我的代碼,並且它在調用來自actionPerformed方法的重繪時不執行paintComponent函數。只需複製粘貼我的代碼並用java編譯器編譯它,並且它不會執行paintComponent方法,因爲我在paint方法內使用了一個System.out.println()方法,因此執行了一個可以告訴我的操作。並且它不會繪製任何東西,因爲我只是試圖檢查它是否調用paint方法AT ALL,因爲我將一個系統輸出放入paintComponent方法中,在使用repaint時不會執行該方法。這只是一個測試,並沒有奏效。

那麼你的意思是SSCCE在哪裏,這就是我擁有的所有代碼。我完全編譯了我在我的主帖中發佈的代碼,問題在於它在執行操作(並且調用重繪事件)時不顯示任何系統輸出。我無法看到我的帖子中有什麼錯過? 「

+0

我給你一個關於如何在你的原始問題的評論中寫一個SSCCE的鏈接!當我在2天前回答您的其他問題時,我還爲您提供了一個鏈接:http://stackoverflow.com/questions/4060006/readding-panel-to-layout-after-editing-panel。你沒有理由不知道什麼是SSCCE,你不止一次被問過。不僅如此,您可以通過搜索網絡找出SSCCE的含義! – camickr 2010-11-02 16:27:47

+0

是的,它說這是一個:短,自包含,正確(可編譯),例子。我的帖子是這樣的,所以我仍然不明白爲什麼我的帖子不會是「SSCCE」。我發佈了我使用的正確代碼,問題和簡短... – Skyfe 2010-11-04 18:14:39