编辑: 我已解决了潜在问题。我使用
SwingUtilities.invokeLater()
来解决问题。我的other question为感兴趣的人提供了更多信息。
我有一个GUI,在JPanel
paintComponent()
g.drawImage()
JPanel
上显示图像。我编写了一个名为CanvasPanelView
的{{1}}子类来覆盖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 :(得分:1)
为什么不将 documentView 放在Panel(BorderLayout)中,而不是做'setBounds',如BorderLayout.CENTER?
或者,您可以根据图片尺寸设置 documentview 的最小尺寸和首选尺寸。
答案 1 :(得分:0)
你写了一个班级CanvasPanelView
。此类扩展JPanel
。看来,在您setBounds
的实施中,您没有提及JPanel
和getHeight()
所指的getWidth()
成员。因此,底层对象的高度为0,宽度为0。
如果您希望将JPanel
值用于高度和宽度,则只需确保为其分配值。