当小部件大小更改时,SWT GridLayout 列不会调整大小

SWT GridLayout column does not resize when widget size changes

我有一个由两列组成的 SWT GridLayout。一列是一个标签,它应该正好是其文本的水平大小。另一列是 StyledText,它应该占据剩余的水平 space。但是,如果标签的大小发生变化(因为文本发生变化),则网格不会调整大小。这导致 Label 与 StyledText 重叠。我想要的是让网格调整列的大小,以便左列变得足够大以容纳较长的文本,而右手列正好缩小该数量。有几个关于 SWT GridLayouts 和调整 SO 大小的问题,但其中 none 解决了这个问题。标题为 SWT GridLayout columns overlap 的似乎是赢家,只是它并不完全相同并且没有实际答案。 这是 Overlapping GridLayout

的图片
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.graphics.Font;

final class GridOverlap{
  public static void main(String [] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    GridLayout layout = new GridLayout(2, false);

    shell.setLayout(layout);

    Label rows = new Label(shell, SWT.RIGHT);
    rows.setText("1");
    GridData rowsLayoutData = new GridData(SWT.RIGHT, SWT.FILL, false, true);
    rows.setLayoutData(rowsLayoutData);
    
    StyledText editor = new StyledText(shell, SWT.V_SCROLL | SWT.H_SCROLL);
    GridData editorLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
    editor.setLayoutData(editorLayoutData);
    editor.setText("Overlapped");

    shell.open();

    // This is where the problem is.
    rows.setText("1000\n999");
    rows.pack();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()){
        display.sleep();
      }
    }
    display.dispose();
  }
}

您需要告诉 shell 重新计算整个 shell 的布局以考虑更改大小。

使用

shell.layout();

而不是 rows.pack()