gpt4 book ai didi

java - 为什么在调用paintComponent()之前getWidth()和getHeight()返回0?

转载 作者:行者123 更新时间:2023-12-01 14:35:50 26 4
gpt4 key购买 nike

Edit: I have solved the underlying problem. I used SwingUtilities.invokeLater() to solve the issue. My other question provides more information for those who are interested.

我有一个 GUI,它使用 g.drawImage()paintComponent() 中的 JPanel 上显示图像。我编写了一个名为 CanvasPanelViewJPanel 子类来重写 paintComponent() 并执行其他一些操作,例如设置图像所在位置的边界画。问题是我需要获取 JPanel 的宽度和高度,当我在扩展 JPanel 的类中调用 this.getWidth()this.getHeight() 时,它们两者都返回 0

该过程从 Action 监听器内部类开始:

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;
}

DocumentViewCanvasPanel 和其他一些东西的包装类 - 它只是将每个打开的文档附带的东西组合在一起。

一切似乎都已实例化并使用或添加到 JTabbedPane 中,所以我不知道为什么 this.getWidth()this.getHeight( ) 返回0。也许在 setBounds() 结束和 paintComponent() 之间发生了一些事情。

为什么 this.getWidth()this.getHeight() 返回 0

最佳答案

为什么不将 documentView 放在 Panel(BorderLayout) 内的某个位置(例如 BorderLayout.CENTER),而不是执行“setBounds”?

或者,您可以根据图像尺寸设置文档 View 的最小和首选尺寸。

关于java - 为什么在调用paintComponent()之前getWidth()和getHeight()返回0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com