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()
呼び出されると、 currentCanvasPanelView
は を返すため、サイズを持ってはなりません0
。私は以前にこの問題を抱えていましたが、私の解決策は #3 の次のコード行でした。
if (initialRender) {
initialRender = false;
setZoomFit();
}
paintComponent() が呼び出されたCanvasPanelView
とき、それまでに にサイズが指定されている必要がありますが、getZoomFactor() が呼び出されたときではありません。paintComponent()、したがって setZoomFit() も、明らかに getZoomFactor() の後に来ます。
画像を開いたときに画像のズーム レベルを正しく表示するにはどうすればよいですか?