首页 文章

Java SWT从对话框更新画布

提问于
浏览
0

我正在使用Java和SWT开发GUI应用程序 .
我创建了一个带有画布的主窗口,我在其中加载了一个图像(这是一个转换为图像的PDF页面) .
我已经将PaintListener附加到画布上,当我将鼠标拖到画布上时,我可以绘制一个矩形 .
当我在鼠标上释放左键时,我想要一个对话窗口出现在"fine setting"的矩形区域,所以我做了一个带有4个微调器(x,y,宽度和高度)的对话框 .
现在我想点击微调器,画布重绘已更改的矩形区域 .
我试图将canvas对象传递给对话框窗口并附加第二个绘制侦听器(所以我有一个来自MainWindow.java的paintlistener和另一个来自Dialog.java),但它没有用 .
问题是我在画布上绘制了多个矩形,如果我从对话框窗口调用canvas.redraw(),则已经在画布"disappeared"上绘制了矩形 .

在这种情况下最好的做法是什么?
我想放置对话框窗口"in the toolbar",即将4个微调器放在工具栏中(或主窗口中的另一个区域),这样我只有一个绘图监听器并摆脱对话框,但我更喜欢对话框'因为它是将矩形拖到画布上然后移动鼠标以在工具栏上单击是不实际的 .

提前谢谢,毛罗

1 回答

  • 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时,您的窗口都会收到通知 . 从我的角度来看,这是一个很好的解决方案,因为您的窗口和对话框甚至不知道彼此存在,并且您可以轻松添加另一个对优先级更改做出反应的组件 .

相关问题