編輯:我已經解決了底層問題。我用
SwingUtilities.invokeLater()
來解決這個問題。我的other question爲有興趣的人提供了更多信息。爲什麼getWidth()和getHeight()在調用paintComponent()之前返回0?
我有一個顯示在paintComponent()
與g.drawImage()
上的JPanel
的圖像的GUI。我寫了一個叫做CanvasPanelView
的JPanel
的子類來覆蓋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
?
'getWith()'返回0,因爲當時的組件*是*零大小,但爲什麼,我不知道。我不認爲你已經提出了一個可回答的問題,因爲你可能遺漏了太多,這對於瞭解你爲什麼會看到你的錯誤以及留下很多與問題無關的代碼是必要的。如果您很快就沒有很好的答案,請考慮創建併發布[sscce](http://sscce.org)。 – 2013-05-11 14:24:40
相關的事情提,並與您SSCCE顯示包括保持圖像顯示組件,以及如何將組件添加到容器中的容器的佈局。 – 2013-05-11 14:31:03
同意,正確的,那麼答案可能很簡單 – mKorbel 2013-05-11 15:00:46