编辑: 我已经解决了根本问题。我曾经
SwingUtilities.invokeLater()
解决这个问题。我的另一个问题为感兴趣的人提供了更多信息。
JPanel
我有一个 GUI,可以在.inpaintComponent()
上显示图像g.drawImage()
。我写了一个JPanel
被调用的子类CanvasPanelView
来覆盖paintComponent()
并做一些其他的事情,比如设置图像绘制位置的边界。问题是我需要获取 JPanel 的宽度和高度,当我调用this.getWidth()
并this.getHeight()
在扩展 JPanel 的类中时,它们都返回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
?