Java 启动应用程序时,在Mac上挂起缩放的桌面。既有Swing&;SWT
我在Mac电脑上(用10.6.4、10.7.5和10.8.2测试),桌面被放大。在使用Swing和SWT的Java应用程序时,窗口一开始就冻结了。这个问题也可以通过SWT网页上提供的代码片段337进行复制(这里是一个示例) 有人知道如何解决这个问题吗?谢谢 编辑-解决方案1 如果我将setVisible包含在asyncExec中,并且不使用SWT_AWT shell,而是像这样使用普通shell:Java 启动应用程序时,在Mac上挂起缩放的桌面。既有Swing&;SWT,java,macos,swing,swt,swt-awt,Java,Macos,Swing,Swt,Swt Awt,我在Mac电脑上(用10.6.4、10.7.5和10.8.2测试),桌面被放大。在使用Swing和SWT的Java应用程序时,窗口一开始就冻结了。这个问题也可以通过SWT网页上提供的代码片段337进行复制(这里是一个示例) 有人知道如何解决这个问题吗?谢谢 编辑-解决方案1 如果我将setVisible包含在asyncExec中,并且不使用SWT_AWT shell,而是像这样使用普通shell: .... display.asyncExec(new Runnable() { @Overr
....
display.asyncExec(new Runnable() {
@Override
public void run() {
mainFrame.pack();
mainFrame.setVisible(true);
});
....
launchBrowserButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
display.asyncExec(new Runnable() {
public void run() {
Shell shell = new Shell(display);
shell.setSize(800, 600);
Browser browser = new Browser(shell, SWT.NONE);
...
}
});
}
});
对于这个简单的示例,它似乎很有效,但在我的应用程序中,它仍然挂起在EDQ中调度的某个事件,因此不是一个解决方案
解决方案2
如果我替换EventQueue以在Thread0中分派事件,它也适用于这个小示例,它也成功地启动了我的复杂应用程序,但是稍后这个队列替换会产生一些其他随机错误
...
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new MyEDQ());
...
class MyEQD extends EventQueue {
@Override
protected void dispatchEvent( AWTEvent arg0) {
final AWTEvent event = arg0;
A.display.asyncExec(new Runnable() {
@Override
public void run() {
MyEQD.super.dispatchEvent(event); }
});
}
}
}
...
还有人知道如何更优雅地解决Thread0和EventDispatchThread之间的同步问题,这样我就不会遇到其他问题了
....
display.asyncExec(new Runnable() {
@Override
public void run() {
mainFrame.pack();
mainFrame.setVisible(true);
});
....
launchBrowserButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
display.asyncExec(new Runnable() {
public void run() {
Shell shell = new Shell(display);
shell.setSize(800, 600);
Browser browser = new Browser(shell, SWT.NONE);
...
}
});
}
});
...
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new MyEDQ());
...
class MyEQD extends EventQueue {
@Override
protected void dispatchEvent( AWTEvent arg0) {
final AWTEvent event = arg0;
A.display.asyncExec(new Runnable() {
@Override
public void run() {
MyEQD.super.dispatchEvent(event); }
});
}
}
}
...