我正在尝试使用 MVC 设计模式在 Java 中制作图像编辑应用程序。因此,事件处理在控制器中,状态和与状态相关的操作存储在模型中,用户看到的所有内容都存储在视图中。
当我打开图像时,有一个缩放框显示正在显示的图像的缩放级别。首次渲染时会自动计算缩放paintComponent()
(参见步骤#3)。当我打开图像时,我希望将缩放级别设置为计算得出的值。问题是缩放级别显示 0,我知道为什么。让我解释:
1.触发 打开ActionListener
的菜单项
在 JPSController 中:
class MenuBarFileOpenListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
File fileChooserReturnValue = view.showAndGetValueOfFileChooser();
if (fileChooserReturnValue != null) {
try {
// irrelevant code omitted
view.addDocument(newDocument);
} catch(IOException ex) {
ex.printStackTrace();
}
}
}
}
2. view.addDocument()
被称为
注意:这是问题的根源
在 JPSView 中:
public void addDocument(DocumentModel document) {
// irrelevant code omitted
// CanvasPanelView extends JPanel
documentsTabbedPane.add(newDocumentView.getCanvasPanelView());
// THIS IS THE ROOT OF THE PROBLEM
double currentZoomFactor = getCurrentCanvasPanelView().getZoomFactor();
// formatting the text
String zoomLevelText = statusBar_zoomLevelTextField_formatter.format(currentZoomFactor);
// setting the text of the text field
statusBar_zoomLevelTextField.setText(zoomLevelText);
}
3. 一段时间后, paintComponent()
运行
在 CanvasPanelView 扩展 JPanel:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (initialRender) {
initialRender = false;
// calculates a good zoom level
setZoomFit();
}
// irrelevant code omitted
g.drawImage(image, destinationX1, destinationY1, destinationX2,
destinationY2, sourceX1, sourceY1, sourceX2, sourceY2, null);
}
在第 2 部分中,我们有这行代码:
double currentZoomFactor = getCurrentCanvasPanelView().getZoomFactor();
当getZoomFactor()
被调用时,当前CanvasPanelView
不能有大小,因为它返回0
. 我之前遇到过这个问题,我的解决方案是使用 #3 中的这些代码行:
if (initialRender) {
initialRender = false;
setZoomFit();
}
当调用paintComponent() 时,CanvasPanelView
必须已经给定了尺寸,但在调用getZoomFactor() 时没有。paintComponent(),因此还有 setZoomFit(),显然在 getZoomFactor() 之后。
打开图像时如何正确显示图像的缩放级别?