我正在使用Java中的SWT开发应用程序,并且我遇到了来自多个StyledText
小部件的一些奇怪的行为。它是相当一致的:如果窗口/视图/编辑器中同时显示多个StyledText
窗口小部件,您可以同时从每个窗口/视图/编辑器中单独选择。在屏幕截图中,有4个单独的小部件,有4个单独的选项。
我的期望是,如果我开始从一个小部件中进行选择,那么可能已经有选择的其他小部件应该丢失它,类似于您期望从Web浏览器中获得的行为;一次只能选择一个。
我想解决这个问题,但我希望避免需要让一些管理员监听每个小部件,并在制作新小部件时关闭选择。有一个更好的方法吗? (另外为什么会发生这种情况?)
答案 0 :(得分:1)
据我所知,小部件的行为取决于它的实现,即它是否是
native widget
(喜欢 org.eclipse.swt.widgets.Text
)或custom widget
(赞 org.eclipse.swt.custom.StyledText
)区别在于处理mouse down
或mouse up
事件。
如果org.eclipse.swt.widgets.Text
left mouse down
最终转换为OS.SendMessage (hwnd, OS.WM_LBUTTONUP, wParam, lParam);
<强> Whereas
强>
org.eclipse.swt.custom.StyledText
在handleMouseDown(Event event)
方法中使用鼠标事件处理程序和额外处理。大多数功能或UI都是使用自定义 draw/redraw/validate/invalidate/update
方法完成的。
用一种非常粗糙的win32 sdk方式:
See
以下SWT代码,该代码使用 text , styledtext , browser 等进行测试。此外注意浏览器控件并不完全是win32控件,它是围绕Internet Explorer activex或mozilla的gecko引擎的包装器控件,therefore
其行为与styled text
的行为相同。
好吧,我只能考虑借用SWT的样式文本代码然后制作一个适合我的版本。
<强> Code:
强>
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class StyledTextTest {
private static Display display;
public static void main(String[] args)
{
display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2,true));
shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
createStyledText(shell);
createStyledText(shell);
createText(shell);
createText(shell);
createCombo(shell);
createCombo(shell);
createCustomCombo(shell);
createCustomCombo(shell);
createBrowser(shell);
createBrowser(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static void createCustomCombo(Composite parent)
{
new Label(parent, SWT.NONE).setText("Custom Combo");
CCombo c = new CCombo(parent, SWT.DROP_DOWN);
c.setItems(new String[] {"test best", "best rest", "rest test"});
c.select(0);
c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
}
private static void createCombo(Composite parent)
{
new Label(parent, SWT.NONE).setText("Combo");
Combo c = new Combo(parent, SWT.DROP_DOWN);
c.setItems(new String[] {"test best", "best rest", "rest test"});
c.select(0);
c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
}
static void createBrowser(Composite parent)
{
new Label(parent, SWT.NONE).setText("Browser");
Browser browser = new Browser(parent, SWT.NONE);
browser.setText("<div>This is a test !!</div>");
browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
}
static void createText(Composite parent) {
new Label(parent, SWT.NONE).setText("Text");
final Text text = new Text(parent, SWT.BORDER);
text.setText("0123456789 ABCDEFGHIJKLM NOPQRSTUVWXYZ");
}
static void createStyledText(Composite parent)
{
new Label(parent, SWT.NONE).setText("Styled Text");
StyledText text = new StyledText (parent, SWT.BORDER|SWT.SINGLE);
text.setText("0123456789 ABCDEFGHIJKLM NOPQRSTUVWXYZ");
// make 0123456789 appear bold
StyleRange style1 = new StyleRange();
style1.start = 0;
style1.length = 10;
style1.fontStyle = SWT.BOLD;
text.setStyleRange(style1);
// make ABCDEFGHIJKLM have a red font
StyleRange style2 = new StyleRange();
style2.start = 11;
style2.length = 13;
style2.foreground = display.getSystemColor(SWT.COLOR_RED);
text.setStyleRange(style2);
// make NOPQRSTUVWXYZ have a blue background
StyleRange style3 = new StyleRange();
style3.start = 25;
style3.length = 13;
style3.fontStyle = SWT.BOLD | SWT.ITALIC;
text.setStyleRange(style3);
}
}