编辑:我已经解决了底层问题。我用
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