如何使用多个StyledText小部件停止多个选择

时间:2012-02-28 20:53:40

标签: java swt

我正在使用Java中的SWT开发应用程序,并且我遇到了来自多个StyledText小部件的一些奇怪的行为。它是相当一致的:如果窗口/视图/编辑器中同时显示多个StyledText窗口小部件,您可以同时从每个窗口/视图/编辑器中单独选择。在屏幕截图中,有4个单独的小部件,有4个单独的选项。

a clip of what I mean

我的期望是,如果我开始从一个小部件中进行选择,那么可能已经有选择的其他小部件应该丢失它,类似于您期望从Web浏览器中获得的行为;一次只能选择一个。

我想解决这个问题,但我希望避免需要让一些管理员监听每个小部件,并在制作新小部件时关闭选择。有一个更好的方法吗? (另外为什么会发生这种情况?)

1 个答案:

答案 0 :(得分:1)

为什么会这样?

据我所知,小部件的行为取决于它的实现,即它是否是

  1. native widget喜欢 org.eclipse.swt.widgets.Text)或
  2. custom widget org.eclipse.swt.custom.StyledText
  3. 区别在于处理mouse downmouse up事件。

    例如,

    如果org.eclipse.swt.widgets.Text left mouse down最终转换为OS.SendMessage (hwnd, OS.WM_LBUTTONUP, wParam, lParam);

    <强> Whereas

    org.eclipse.swt.custom.StyledTexthandleMouseDown(Event event)方法中使用鼠标事件处理程序和额外处理。大多数功能或UI都是使用自定义 draw/redraw/validate/invalidate/update方法完成的。

    用一种非常粗糙的win32 sdk方式:

    1. windows / win32 GDI提供了一些控件
    2. 并且,有些是自定义用户绘制的控件
    3. See 以下SWT代码,该代码使用 text styledtext browser 等进行测试。此外注意浏览器控件并不完全是win32控件,它是围绕Internet Explorer activex或mozilla的gecko引擎的包装器控件,therefore其行为与styled text的行为相同。

      任何可能的解决方案?

      好吧,我只能考虑借用SWT的样式文本代码然后制作一个适合我的版本。

      或者

      正如您已经提到的,使用一些监听器来重置所有其他未聚焦的小部件(这在我看来甚至不是一个非常干净的解决方案)。

      测试代码&amp;输出

      enter image description here

      <强> 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);
      
          }
      }