2013-05-11 96 views
0

編輯:我已經解決了底層問題。我用SwingUtilities.invokeLater()來解決這個問題。我的other question爲有興趣的人提供了更多信息。爲什麼getWidth()和getHeight()在調用paintComponent()之前返回0?

我有一個顯示在paintComponent()g.drawImage()上的JPanel的圖像的GUI。我寫了一個叫做CanvasPanelViewJPanel的子類來覆蓋paintComponent()並做了其他一些事情,比如設置圖像繪製位置的邊界。問題是,我需要得到JPanel的寬度和高度,當我在擴展JPanel類調用this.getWidth()this.getHeight(),他們都返回0

該過程在一個動作偵聽器開始內部類:

class MenuBarFileOpenListener implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     File fileChooserReturnValue = view.showAndGetValueOfFileChooser(); 

     if (fileChooserReturnValue != null) { 
      try { 
       DocumentModel newDocument = new DocumentModel(ImageIO.read(fileChooserReturnValue), fileChooserReturnValue.getAbsolutePath(), fileChooserReturnValue.getName()); 
       model.addDocument(newDocument); 
       view.addDocument(newDocument); 
      } catch(IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 

然後,addDocument()叫做:

public void addDocument(DocumentModel document) { 
    menuBar_file_close.setEnabled(true); 

    DocumentView newDocumentView = new DocumentView(document.getTitle(), documentsTabbedPaneCloseButtonListener); 

    documentViews.add(newDocumentView); // add newDocumentView to ArrayList<DocumentView> 
    newDocumentView.setDocument(document); 
    documentsTabbedPane.add(newDocumentView.getCanvasPanelView()); 

    int newDocumentIndex = documentsTabbedPane.indexOfComponent(newDocumentView.getCanvasPanelView()); 

    documentsTabbedPane.setTabComponentAt(newDocumentIndex, newDocumentView.getTabPanel()); 
    documentsTabbedPane.setSelectedIndex(newDocumentIndex); 
    newDocumentView.setBounds(document.getImageWidth(), document.getImageHeight()); 
} 

public DocumentView(String title, ActionListener listener) { 
    canvas = new CanvasPanelView(); 
    // more code... 
} 

setBounds()叫做:

public void setBounds(int imageWidth, int imageHeight) { 
    sourceX1 = 0; 
    sourceY1 = 0; 
    sourceX2 = imageWidth; 
    sourceY2 = imageHeight; 

    // some math... 

    destinationX1 = 0 + xMargin; 
    destinationY1 = 0 + yMargin; 
    destinationX2 = drawWidth - xMargin; 
    destinationY2 = drawHeight - yMargin; 
} 

DocumentView是一個包裝類爲CanvasPanel和一些其他的東西 - 它只是將每個打開文檔的內容組合在一起。

一切似乎被實例化並使用或添加到JTabbedPane,所以我不知道爲什麼this.getWidth()this.getHeight()返回0。在setBounds()paintComponent()之間可能會出現某種情況。

爲什麼this.getWidth()this.getHeight()返回0

+0

'getWith()'返回0,因爲當時的組件*是*零大小,但爲什麼,我不知道。我不認爲你已經提出了一個可回答的問題,因爲你可能遺漏了太多,這對於瞭解你爲什麼會看到你的錯誤以及留下很多與問題無關的代碼是必要的。如果您很快就沒有很好的答案,請考慮創建併發布[sscce](http://sscce.org)。 – 2013-05-11 14:24:40

+1

相關的事情提,並與您SSCCE顯示包括保持圖像顯示組件,以及如何將組件添加到容器中的容器的佈局。 – 2013-05-11 14:31:03

+0

同意,正確的,那麼答案可能很簡單 – mKorbel 2013-05-11 15:00:46

回答

0

你寫了一個類,CanvasPanelView。本課程延伸至JPanel。它的出現,在你執行你setBounds沒有提到的JPanel成員,getHeight()getWidth()參考。因此,底層對象的高度爲0,寬度爲0。

如果您想使用JPanel值的高度和寬度,然後你只需要確保你給他們分配值。

1

而不是做一個'setBounds',爲什麼不把你的documentView一個Panel(BorderLayout),在一個位置,如BorderLayout.CENTER?

或者,您可以根據圖像尺寸設置文檔視圖的最小尺寸和首選尺寸。

相關問題