在 Java 的另一个 SWT 框架内单击按钮打开 SWT 模态
Open a SWT modal on button click inside another SWT Framework in Java
我写了如下框架class。我想打开某种模式,它将在单击按钮时保存组件(即按钮、文本框等)。我已经尝试过 JFrame 并且它有效,但是,我无法获得一致的设计来匹配父 shell。例如,JFrames 上的按钮看起来与 SWT shells 不同。
单击按钮时出现错误...
Exception in thread "main" org.eclipse.swt.SWTException: Invalid thread access
这能做到吗?如果没有,谁能给我任何其他建议?
package framework;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import framework.SWTResourceManager;
public class Frontend {
/** Declare display, shell and data text objects */
Display display = new Display();
Shell shell = new Shell(display, SWT.CLOSE);
private Button btnOpen;
/** Initialise frame */
public Frontend() {
init();
shell.pack();
shell.open();
shell.setSize(600, 600);
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void init() {
// Set background of framework.
shell.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
btnOpen = new Button(shell, SWT.NONE);
btnOpen.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
btnOpen.setText("Open");
btnOpen.setBounds(20, 20, 50, 50);
btnOpen.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Display visual_display = new Display();
Shell visual_shell = new Shell(visual_display, SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.ON_TOP);
visual_shell.pack();
// Set framework size.
visual_shell.setSize(600,600);
visual_shell.open();
while (!visual_shell.isDisposed()) {
if (!visual_display.readAndDispatch()) {
visual_display.sleep();
}
}
visual_display.dispose();
}
});
}
// Run Frame.
public static void main(String[] args) {
new Frontend();
}
}
当按下按钮时,您的 SWT 代码正在创建一个新的 Display
- 您不应该这样做。一个 SWT 应用程序应该只为整个应用程序使用一个 Display
对象。
所以你选择的监听器应该是这样的:
btnOpen.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Shell visual_shell = new Shell(display, SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.ON_TOP);
visual_shell.pack();
// Set framework size.
visual_shell.setSize(1010,600);
visual_shell.open();
while (!visual_shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
});
这只是使用 display
而不是调用 Display.dispose
。
您可能还想查看 Eclipse JFace,它添加到 SWT 并提供更易于使用的对话框。
我写了如下框架class。我想打开某种模式,它将在单击按钮时保存组件(即按钮、文本框等)。我已经尝试过 JFrame 并且它有效,但是,我无法获得一致的设计来匹配父 shell。例如,JFrames 上的按钮看起来与 SWT shells 不同。
单击按钮时出现错误...
Exception in thread "main" org.eclipse.swt.SWTException: Invalid thread access
这能做到吗?如果没有,谁能给我任何其他建议?
package framework;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import framework.SWTResourceManager;
public class Frontend {
/** Declare display, shell and data text objects */
Display display = new Display();
Shell shell = new Shell(display, SWT.CLOSE);
private Button btnOpen;
/** Initialise frame */
public Frontend() {
init();
shell.pack();
shell.open();
shell.setSize(600, 600);
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void init() {
// Set background of framework.
shell.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
btnOpen = new Button(shell, SWT.NONE);
btnOpen.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
btnOpen.setText("Open");
btnOpen.setBounds(20, 20, 50, 50);
btnOpen.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Display visual_display = new Display();
Shell visual_shell = new Shell(visual_display, SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.ON_TOP);
visual_shell.pack();
// Set framework size.
visual_shell.setSize(600,600);
visual_shell.open();
while (!visual_shell.isDisposed()) {
if (!visual_display.readAndDispatch()) {
visual_display.sleep();
}
}
visual_display.dispose();
}
});
}
// Run Frame.
public static void main(String[] args) {
new Frontend();
}
}
当按下按钮时,您的 SWT 代码正在创建一个新的 Display
- 您不应该这样做。一个 SWT 应用程序应该只为整个应用程序使用一个 Display
对象。
所以你选择的监听器应该是这样的:
btnOpen.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Shell visual_shell = new Shell(display, SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.ON_TOP);
visual_shell.pack();
// Set framework size.
visual_shell.setSize(1010,600);
visual_shell.open();
while (!visual_shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
});
这只是使用 display
而不是调用 Display.dispose
。
您可能还想查看 Eclipse JFace,它添加到 SWT 并提供更易于使用的对话框。