我正在尝试创建一个包含ScrolledComposite中显示的StyledText框的应用程序。我在StyledText框中显示大量行有困难(超过2,550似乎会导致问题)。
StyledText框本身不能有滚动条,但必须可以通过ScrolledComposite滚动。由于StyledText下方和上方还有其他需要滚动的项目,我不想要多个滚动条。
因此,对于大量数据,我有一个非常大(如高度)的StyledText框似乎在一定高度后停止。
问题是StyledText应该和它的内容一样高,而不是。下面的差距的原因是包含复合材料正在调整StyledText报告的高度,但这实际上并不是它的高度。
以下是一段用于说明我的问题的简化示例代码:
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class ExpandBox2
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Example");
shell.setLayout(new FillLayout());
ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL);
scrolledComposite.setLayout(new FillLayout(SWT.VERTICAL));
Composite mainComp = new Composite(scrolledComposite, SWT.NONE);
mainComp.setLayout(new FillLayout(SWT.VERTICAL));
StyledText styledText = new StyledText(mainComp, SWT.NONE);
styledText.getContent().setText(bigString());
mainComp.setSize(mainComp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
scrolledComposite.setContent(mainComp);
scrolledComposite.setMinSize(mainComp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
scrolledComposite.getVerticalBar().setIncrement(10);
shell.setSize(400, 350);
shell.open();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) {
display.sleep ();
}
}
display.dispose();
}
private static String bigString()
{
String big = "";
for(int i=0;i<10000;i++)
{
big = big + "hello\r\n";
}
return big;
}
}
更新:有趣的是,SWT Label和SWT Text
会出现此问题答案 0 :(得分:4)
这实际上是Windows限制。复合材料在窗口中可能只有一定的大小,不超过32767(像素,我假设)。
这是找到的scrolledComposite,因为它实际上不是&gt; 32767,它似乎是。而对于mainComp,实际大小是> 32767这就是我们被切断的地方。
最初我认为这是一个Eclipse错误并提交了一份报告,我被告知这是一个Windows问题/功能:https://bugs.eclipse.org/bugs/show_bug.cgi?id=333111
答案 1 :(得分:0)
也许你可以通过反过来解决这个问题并将你的“其他东西”放在StyledText中?然后使StyledText滚动而不是ScrolledComposite
。 StyledText支持嵌入图像和控件,并且您能够实现侦听器(例如VerifyListener
)以防止用户删除嵌入对象 - 如果这是您想要的。
以下是一些示例代码:
如果您希望控件看起来比第二个示例更好,则可以使控件占据文本区域的整个宽度(并在调整区域大小时收听事件 - 使用styledText.addListener(SWT.Resize, new Listener() ...
)