Я пытаюсь сделать приложение для редактирования изображений на Java с использованием шаблона проектирования MVC. Таким образом, обработка событий в контроллере, состояние и операции, относящиеся к состоянию, хранятся в моделях, и все, что видит пользователь, хранится в представлениях.Как я могу исправить эту ошибку кода?
Когда я открываю изображение, появляется окно масштабирования, которое отображает уровень масштабирования отображаемого изображения. Масштаб автоматически рассчитывается, когда он сначала отображается в 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().
Как правильно показать уровень масштабирования изображения при его открытии?
Я думаю, вы можете просто добавить [ComponentListener] (HTTP: //docs.oracle.com/javase/7/docs/api/java/awt/event/ComponentListener.html), к указанному веществу и может возвращать действительную 'WIDTH/HEIGHT' соответствующего' JComponent' в разных состояниях, т. е. 'показано/скрытые/изменить размер/moved'. Таким образом, вы можете получить фактический размер, хранящийся в переменной класса, который фактически управляет состоянием 'JComponent' –