我正在使用Java和SWT开发一个GUI应用程序。
我创建了一个带有画布的主窗口,我在其中加载了一个图像(好吧,它将PDF页面转换为图像)。我已将PaintListener附加到画布上,当我将鼠标拖到画布上时,我可以绘制一个矩形。
当我在鼠标上释放左键时,我想要一个对话窗口出现在"精细设置"矩形区域,所以我用4个微调器(x,y,宽度和高度)进行了对话
现在我想点击微调器和画布重绘已更改的矩形区域。
我试图将画布对象传递给对话框窗口并附加第二个绘图侦听器(所以我有一个来自MainWindow.java的paintlistener另一个来自Dialog.java),但它没有用。
问题是我在画布上绘制了多个矩形,如果我从对话框窗口调用canvas.redraw(),那么已经在画布上绘制的矩形"消失了#34;。
什么在这种情况下最好的做法是什么?
我想把对话框窗口"放在工具栏中,将4个微调器放在工具栏中(或主窗口中的另一个区域),这样我只有一个绘图监听器并摆脱对话框,但我更喜欢对话框,因为将矩形拖到画布上然后移动鼠标来点击工具栏是不实际的。
在此先感谢Mauro
答案 0 :(得分:0)
您的主窗口应该实现自定义侦听器,例如:
public interface PreferencesListener {
public void updatePreference(PreferencesEvent e)
}
然后创建一个控制更新的管理器:
public class PreferencesController {
private static PreferencesController instance = new PreferencesController();
private List<PreferencesListener> preferencesListeners;
private PreferencesController() {
preferencesListeners = new ArrayList<PreferencesListener>();
}
public static PreferencesController getInstance() {
return instance;
}
public void addPreferenceListener(PreferencesListener listener) {
preferencesListeners.add(listener);
}
public void notify(int x, int y, int w, int h) {
PreferencesEvent e = new PreferencesEvent(x, y, w, h);
for(final PreferencesListener listener: preferencesListeners) {
listener.updatePreference(e);
}
}
}
创建时,主窗口在控制器中注册:
PreferencesController.getInstance().addPreferenceListener(this);
在对话框触发器中更改值时,通知:
PreferencesController.getInstance().notify(x,y,w,h);
然后最终从PreferencesListener实现updatePreference(PreferencesEvent e)。从这一刻起,每当更改值x y w h时,都会通知您的窗口。从我的角度来看,这是一个很好的解决方案,因为你的窗口和对话甚至不知道彼此存在,你可以轻松地添加另一个对偏好变化做出反应的组件。