Java SWT从对话框更新画布

时间:2015-09-28 10:44:27

标签: java canvas swt

我正在使用Java和SWT开发一个GUI应用程序。
我创建了一个带有画布的主窗口,我在其中加载了一个图像(好吧,它将PDF页面转换为图像)。我已将PaintListener附加到画布上,当我将鼠标拖到画布上时,我可以绘制一个矩形。
当我在鼠标上释放左键时,我想要一个对话窗口出现在"精细设置"矩形区域,所以我用4个微调器(x,y,宽度和高度)进行了对话 现在我想点击微调器和画布重绘已更改的矩形区域。
我试图将画布对象传递给对话框窗口并附加第二个绘图侦听器(所以我有一个来自MainWindow.java的paintlistener另一个来自Dialog.java),但它没有用。
问题是我在画布上绘制了多个矩形,如果我从对话框窗口调用canvas.redraw(),那么已经在画布上绘制的矩形"消失了#34;。
什么在这种情况下最好的做法是什么? 我想把对话框窗口"放在工具栏中,将4个微调器放在工具栏中(或主窗口中的另一个区域),这样我只有一个绘图监听器并摆脱对话框,但我更喜欢对话框,因为将矩形拖到画布上然后移动鼠标来点击工具栏是不实际的。

在此先感谢Mauro

1 个答案:

答案 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时,都会通知您的窗口。从我的角度来看,这是一个很好的解决方案,因为你的窗口和对话甚至不知道彼此存在,你可以轻松地添加另一个对偏好变化做出反应的组件。