2013-10-15 18 views
5

Tablo boş olsa bile, her zaman dikey kaydırma çubuğunu bir SWT tablosunda göstermek mümkün mü? Her zaman bir (olası devre dışı bırakılmış) dikey kaydırma çubuğunu göstererek, sütunlar, düzen için ColumnWeightData kullandığında son sütunun gizlenmesini engelleyebilir. Tabloyu SWT.V_SCROLL ile başlatmayı veya table.getVerticalBar().setVisible(true)'u kullanmayı denedim - her ikisi de başarılı olmaksızın.SWT tablosunda her zaman dikey kaydırma çubuğu nasıl gösterilir?

ScrollableComposite'da setAlwaysShowScrollBars yöntemi vardır. Aradığım şey, Table'da benzer bir yöntemdir.

GÜNCELLEME: ben tablo yeterli veriyi içerdiğinde görülebilir kaydırma çubukları bu kaydırma çubukları Table devralır Scrollable den olmadığını varsayalım. ScrollBar.setVisible(boolean) hata ayıklandı ve tablo düzeni güncelleştirmelerinde çağrılmıyor gibi görünüyor. Bu gözlem doğru mu?

UPDATE 2: İşte bir masa yapımı için bir parçacık. Tablo boş olsa bile dikey kaydırma çubuğunun görünür olması ve tablo verileri aşağı kaydırılsa bile sütun başlıklarının görünür olması harika olacaktır. Not: Pasaj, etiket sağlayıcısı ve aynı ana bileşikte düzenlenmiş bazı diğer kontroller gibi bazı ayrıntıları dışarıda bırakmıştır.

protected void createMasterPart(final IManagedForm managedForm, Composite parentComposite) 
{ 
    FormToolkit toolkit = managedForm.getToolkit(); 

    Composite contentComposite = toolkit.createComposite(parentComposite, SWT.NONE); 
    contentComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); 
    toolkit.paintBordersFor(contentComposite); 

    contentComposite.setLayout(new GridLayout(2, false)); 
    GridData gd; 

    Composite tableComposite = new Composite(contentComposite, SWT.NONE); 
    TableColumnLayout tableColumnLayout = new TableColumnLayout(); 
    tableComposite.setLayout(tableColumnLayout); 
    gd = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 3); 
    tableComposite.setLayoutData(gd); 

    speakerTableViewer = new TableViewer(tableComposite, SWT.BORDER | SWT.FULL_SELECTION); 
    speakerTableViewer.setContentProvider(ArrayContentProvider.getInstance()); 
    Table speakerTable = speakerTableViewer.getTable(); 
    speakerTable.setHeaderVisible(true); 
    speakerTable.setLinesVisible(true); 
    toolkit.paintBordersFor(speakerTable); 

    TableViewerColumn tableViewerAudiosampleColumn = new TableViewerColumn(speakerTableViewer, SWT.NONE); 
    TableColumn audiosampleColumn = tableViewerAudiosampleColumn.getColumn(); 
    tableColumnLayout.setColumnData(audiosampleColumn, new ColumnWeightData(60, true)); 
    audiosampleColumn.setText("Sample"); 

    TableViewerColumn tableViewerSpeakerColumn = new TableViewerColumn(speakerTableViewer, SWT.NONE); 
    TableColumn speakerColumn = tableViewerSpeakerColumn.getColumn(); 
    tableColumnLayout.setColumnData(speakerColumn, new ColumnWeightData(60, true)); 
    speakerColumn.setText("Speaker"); 

    TableViewerColumn tableViewerRemarkColumn = new TableViewerColumn(speakerTableViewer, SWT.NONE); 
    TableColumn remarkColumn = tableViewerRemarkColumn.getColumn(); 
    tableColumnLayout.setColumnData(remarkColumn, new ColumnWeightData(120, true)); 
    remarkColumn.setText("Remark"); 
} 
+0

Tablonuzu panelin içine sarın. – Makky

+0

@Makky “Panel” ile ne demek istiyorsun? – Claude

+0

Neden boş bir veri tablosu için kaydırma çubuğunu görüntülüyorsunuz? – Makky

cevap

6

Her zaman kaydırma çubukları göstermek için Table zorlamak mümkün değildir OS gösterileceği zaman karar verir.

Is it possible to get the vertical/horizontal scroll bar visible when the SWT List is in disabled state?


fikir ScrolledComposite kullanmaktır:

Alternatifler

Tamam.Bu soruya cevabım çok benzer bir çözüm geldi (diğer cevapta da önerildiği gibi) kaydırma işlemine dikkat etmek için. Table'un kendisi kaymayacak. Ancak,, bu fark yaratamayacaktır çünkü kullanıcı farkı anlayamayacaktır.

ScrolledComposite, setAlwaysShowScrollBars(boolean) adlı bir yönteme sahiptir, bununla birlikte, bunlar gerekli olmasa bile, kaydırma çubuklarını her zaman gösterecek şekilde zorlayabilirsiniz.

public static void main(String[] args) 
{ 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setLayout(new GridLayout()); 

    final ScrolledComposite composite = new ScrolledComposite(shell, SWT.V_SCROLL); 
    composite.setLayout(new GridLayout()); 
    composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    final Table table = new Table(composite, SWT.NO_SCROLL | SWT.FULL_SELECTION); 
    table.setHeaderVisible(true); 

    composite.setContent(table); 
    composite.setExpandHorizontal(true); 
    composite.setExpandVertical(true); 
    composite.setAlwaysShowScrollBars(true); 
    composite.setMinSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 

    Button fillTable = new Button(shell, SWT.PUSH); 
    fillTable.setText("Fill table"); 
    fillTable.setLayoutData(new GridData(SWT.FILL, SWT.END, true, false)); 

    fillTable.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event arg0) 
     { 
      if (table.getColumnCount() < 1) 
      { 
       for (int col = 0; col < 4; col++) 
       { 
        TableColumn column = new TableColumn(table, SWT.NONE); 
        column.setText("Column " + col); 
       } 
      } 

      for (int row = 0; row < 20; row++) 
      { 
       TableItem item = new TableItem(table, SWT.NONE); 

       for (int col = 0; col < table.getColumnCount(); col++) 
       { 
        item.setText(col, "Item " + row + " " + col); 
       } 
      } 

      for (int col = 0; col < table.getColumnCount(); col++) 
      { 
       table.getColumn(col).pack(); 
      } 

      composite.setMinSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     } 
    }); 

    Button clearTable = new Button(shell, SWT.PUSH); 
    clearTable.setText("Clear table"); 
    clearTable.setLayoutData(new GridData(SWT.FILL, SWT.END, true, false)); 

    clearTable.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event arg0) 
     { 
      table.removeAll(); 

      composite.setMinSize(table.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     } 
    }); 

    shell.pack(); 
    shell.setSize(400, 300); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

bu gibi görünüyor: Gördüğünüz gibi

enter image description here enter image description here

, kaydırma çubuğu İşte

Sadece konuştuğumuz şeyi göstermek bazı örnek kod vardır her zaman görünür.


GÜNCELLEME

olarak aşağı kaydırırken bu yaklaşım görülebilir Table başlıklarını tutmaz, yorumunda dikkat çekti. Sorununuzu gösteren küçük bir çalışma kodu örneği gönderebildiysek, bir alternatifle (kaydırma çubuklarını zorlamakla alakasız) karşılaşabiliriz.

Update2 İşte

istediğini yapmalıyım bazı kodu hile TableViewer ebeveyni üzerinde yeniden boyutlandırma olayı tetiklemek için ise, gösterilen yatay kaydırma çubuğu gerçekten gerekli değildir ve Ben ScrolledComposite içine tablonuzu koymak daha iyi olduğunu düşünüyorum bir çözüm yarattık

public static void main(String[] args) 
{ 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new GridLayout()); 

    createMasterPart(shell); 

    shell.pack(); 
    shell.setSize(400, 300); 
    shell.open(); 

    shell.layout(true, true); 

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

private static void createMasterPart(Composite parentComposite) 
{ 
    Composite composite = new Composite(parentComposite, SWT.NONE); 
    composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
    composite.setLayout(new GridLayout(1, false)); 

    Composite tableComposite = new Composite(composite, SWT.NONE); 
    TableColumnLayout tableColumnLayout = new TableColumnLayout(); 
    tableComposite.setLayout(tableColumnLayout); 
    tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    TableViewer tableViewer = new TableViewer(tableComposite, SWT.BORDER | SWT.FULL_SELECTION); 
    tableViewer.setContentProvider(ArrayContentProvider.getInstance()); 
    Table table = tableViewer.getTable(); 
    table.setHeaderVisible(true); 
    table.setLinesVisible(true); 

    TableViewerColumn firstTableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); 
    TableColumn firstTableColumn = firstTableViewerColumn.getColumn(); 
    firstTableColumn.setText("Sample"); 
    firstTableViewerColumn.setLabelProvider(new ColumnLabelProvider() 
    { 
     @Override 
     public String getText(Object element) 
     { 
      Dummy p = (Dummy) element; 
      return p.first; 
     } 
    }); 

    TableViewerColumn secondTableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); 
    TableColumn secondTableColumn = secondTableViewerColumn.getColumn(); 
    secondTableColumn.setText("Speaker"); 
    secondTableViewerColumn.setLabelProvider(new ColumnLabelProvider() 
    { 
     @Override 
     public String getText(Object element) 
     { 
      Dummy p = (Dummy) element; 
      return p.second; 
     } 
    }); 

    TableViewerColumn thirdTableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); 
    TableColumn thirdTableColumn = thirdTableViewerColumn.getColumn(); 
    thirdTableColumn.setText("Remark"); 
    thirdTableViewerColumn.setLabelProvider(new ColumnLabelProvider() 
    { 
     @Override 
     public String getText(Object element) 
     { 
      Dummy p = (Dummy) element; 
      return p.third; 
     } 
    }); 

    List<Dummy> elements = new ArrayList<>(); 

    for(int i = 0; i < 20; i++) 
    { 
     elements.add(new Dummy("firstfirstfirst " + i, "secondsecondsecond " + i, "thirdthirdthirdthirdthirdthird " + i)); 
    } 

    tableViewer.setInput(elements); 

    tableColumnLayout.setColumnData(firstTableColumn, new ColumnWeightData(1, true)); 
    tableColumnLayout.setColumnData(secondTableColumn, new ColumnWeightData(1, true)); 
    tableColumnLayout.setColumnData(thirdTableColumn, new ColumnWeightData(2, true)); 
} 

private static class Dummy 
{ 
    public String first; 
    public String second; 
    public String third; 

    public Dummy(String first, String second, String third) 
    { 
     this.first = first; 
     this.second = second; 
     this.third = third; 
    } 
} 
+0

Aşağı kaydırdıktan sonra sütun başlıkları hala görülebilir mi? – Basilevs

+0

@Basilevs Onlar asla SWT 'Tablosu'nda değiller. – Baz

+0

Normal tablo başlıkları her kaydırma konumunda her zaman gösterilir. – Basilevs

-1

ben bunu yapabileceğimi sanmıyorum ama eğer true ScrolledComposite.setAlwaysShowScrollbars() çağrı deneyebilirsiniz, ancak etkin kaydırma hem her zaman göreceksiniz.

+0

Tablo bir "ScrollableComposite" değil ve bir "ScrollableComposite" içinde değil. ScrolledComposite nedir? – Claude

0

: pencereyi yeniden boyutlandırmak sonra kaybolur.

Çözümüm: Kaydırma çubuğum görülene kadar tablomu boş öğelerle doldurun.

Örnek:

// Flag that knows if the empty item was added or not 
boolean addedEmptyItem = false; 

// Get the table client area 
Rectangle rect = table.getClientArea(); 
// Get the item height 
int itemHeight = table.getItemHeight(); 
// Get the header height 
int headerHeight = table.getHeaderHeight(); 
// Calculate how many items can be visible without scrolling 
int visibleCount = (rect.height - headerHeight + itemHeight - 1)/itemHeight; 

while (visibleCount > table.getItemCount()) { 
    // Add an empty item 
    new TableItem(table, SWT.NONE); 

    // Set the flag 
    addedEmptyItem = true; 
} 

// Vertical bar é disabled if an empty item was added 
table.getVerticalBar().setEnabled(!addedEmptyItem); 

ben bu çözüm birisi yardımcı olur.

Teşekkürler.

+0

Örnek için teşekkürler! Bununla birlikte, bu hack'in üretken bir ortamda çalışmasını sağlamak için yapılacak çok şeyden korkuyorum: boş eşyaların seçimini devre dışı bırakmak; Tablo yeniden boyutlandırıldığında uyarlanır; gerçek eşyalar eklendiğinde uyarlayın; masa modelleri ile çalışmak. Yine de teşekkürler! – Claude

İlgili konular