如何在SWT文本组件中实现自动隐藏滚动条

时间:2011-12-17 19:40:01

标签: swing swt scrollbar

我有一个SWT Text组件,我为此设置SWT.MULTISWT.V_SCROLLSWT.H_SCROLL以在需要时显示滚动条。 我发现即使内容小于文本组件,也可以在禁用状态下看到滚动条。

有什么方法可以自动隐藏滚动条吗?像java一样,Swing有JScrollPane.horizo​​ntal_scrollbar_as_needed

4 个答案:

答案 0 :(得分:8)

您可以使用StyledText代替TextStyledText方法setAlwaysShowScrollBars可以设置为false

答案 1 :(得分:7)

适用于所有情况:

Text text = new Text(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

Listener scrollBarListener = new Listener () {
  @Override
  public void handleEvent(Event event) {
    Text t = (Text)event.widget;
    Rectangle r1 = t.getClientArea();
    Rectangle r2 = t.computeTrim(r1.x, r1.y, r1.width, r1.height);
    Point p = t.computeSize(SWT.DEFAULT,  SWT.DEFAULT,  true);
    t.getHorizontalBar().setVisible(r2.width <= p.x);
    t.getVerticalBar().setVisible(r2.height <= p.y);
    if (event.type == SWT.Modify) {
      t.getParent().layout(true);
      t.showSelection();
    }
  }
};
text.addListener(SWT.Resize, scrollBarListener);
text.addListener(SWT.Modify, scrollBarListener);

答案 2 :(得分:6)

@Plamen:非常好的解决方案谢谢。我有同样的问题,但对于没有水平滚动条的样式SWT.WRAP的多行文本。

我必须更改一些内容才能使其正常工作:

Text text = new Text(parent, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);

Listener scrollBarListener = new Listener (){
    @Override
    public void handleEvent(Event event) {
        Text t = (Text)event.widget;
        Rectangle r1 = t.getClientArea();
        // use r1.x as wHint instead of SWT.DEFAULT
        Rectangle r2 = t.computeTrim(r1.x, r1.y, r1.width, r1.height); 
        Point p = t.computeSize(r1.x,  SWT.DEFAULT,  true); 
        t.getVerticalBar().setVisible(r2.height <= p.y);
        if (event.type == SWT.Modify){
           t.getParent().layout(true);
        t.showSelection();
    }
}};
text.addListener(SWT.Resize, scrollBarListener);
text.addListener(SWT.Modify, scrollBarListener);

答案 3 :(得分:0)

根据this你无法隐藏垂直滚动条,它是OS(Windows)特定的L&amp; F.您可以使用不SWT.WRAP的{​​{1}}删除单杠。