[英]SWT Table Resize, once column value and Table Max size reaches
我试图在SWT表中添加一个大的大字符串。 如果将任何大String放置得很长,则该列将占据整个区域,并且下一列甚至都不可见,并且您别无选择。 理想情况下,不应显示太大的最大值,或者应该有某种机制可以处理。
这是带有普通视图的SWT表-我们可以看到5列。
现在,我用很长的String修改了第2列,现在我们只能看到3列,其余的列甚至都不可见。
以下是相同的源代码。 我想知道如果该列的内容很长,如何避免调整大小的问题。
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class Snippet181 {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new RowLayout(SWT.HORIZONTAL));
final Table table = new Table(shell, SWT.BORDER | SWT.CHECK);
table.setLayoutData(new RowData(-1, 300));
table.setHeaderVisible(true);
TableColumn column = new TableColumn(table, SWT.LEFT);
column.setText("Column 0");
column = new TableColumn(table, SWT.CENTER);
column.setText("Column 1");
column = new TableColumn(table, SWT.CENTER);
column.setText("Column 2");
column = new TableColumn(table, SWT.CENTER);
column.setText("Column 3");
column = new TableColumn(table, SWT.CENTER);
column.setText("Column 4");
for (int i = 0; i < 100; i++) {
TableItem item = new TableItem(table, SWT.NONE);
String[] text=null;
if(i >50 && i <55)
text = new String[]{i+" 0", i+" 1", i+"282347378237895728975894758934895893458934789345834895792823473782378957289758947589348958934589347893458348957928234737823789572897589475893489589345893478934583489579282347378237895728975894758934895893458934789345834895792823473782378957289758947589348958934589347893458348957928234737823789572897589475893489589345893478934583489579282347378237895728975894758934895893458934789345834895792823473782378957289758947589348958934589347893458348957928234737823789572897589475893489589345893478934583489579282347378237895728975894758934895893458934789345834895792823473782378957289758947589348958934589347893458348957928234737823789572897589475893489589345893478934583489579282347378237895728975894758934895893458934789345834895792823473782378957289758947589348958934589347893458348957928234737823789572897589475893489589345893478934583489579", i+" 3", i+" 4"};
else
text = new String[]{i+" 0", i+" 1", i+" 282347", i+" 3", i+" 4"};
item.setText(text);
}
Listener listener = new Listener() {
public void handleEvent(Event e) {
System.out.println("Move "+e.widget);
}
};
TableColumn[] columns = table.getColumns();
for (int i = 0; i < columns.length; i++) {
columns[i].pack();
columns[i].setMoveable(true);
columns[i].addListener(SWT.Move, listener);
}
Button b = new Button(shell, SWT.PUSH);
b.setText("invert column order");
b.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
int[] order = table.getColumnOrder();
for (int i = 0; i < order.length / 2; i++) {
int temp = order[i];
order[i] = order[order.length - i - 1];
order[order.length - i - 1] = temp;
}
table.setColumnOrder(order);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
据我所知,使用TableViewer
将使您的生活更加轻松。
这是有关TableViewer
的出色教程。
我创建了一个示例,该示例应为您提供有关如何完成您想做的事情的想法:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
TableViewer viewer = new TableViewer(shell);
/* Create the columns */
for (int i = 0; i < 4; i++)
{
TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
/* Set the trim label provider (will trim the text displayed) */
column.setLabelProvider(new TrimLabelProvider());
column.getColumn().setText("Column " + i);
}
/* Set the input from the content provider */
viewer.setContentProvider(new ArrayContentProvider());
viewer.setInput(DataModelProvider.getInstance().getItems());
/* Style the table */
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
/* Pack the columns */
for (TableColumn column : table.getColumns())
column.pack();
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
/**
* This class holds the data displayed in the table viewer
*/
private static class DataModelProvider
{
private static DataModelProvider INSTANCE;
private List<TableRow> items;
public static DataModelProvider getInstance()
{
if (INSTANCE == null)
INSTANCE = new DataModelProvider();
return INSTANCE;
}
private DataModelProvider()
{
/*
* Create dummy content. One item with short text and one item with
* long text
*/
items = new ArrayList<TableRow>();
items.add(new TableRow(new String[] { "first", "second", "third", "fourth" }));
items.add(new TableRow(new String[] { "first", "second second second second second second second second", "third", "fourth" }));
}
public void addItem(TableRow item)
{
items.add(item);
}
public List<TableRow> getItems()
{
return items;
}
}
/**
* This class models the data items displayed in the table
*/
private static class TableRow
{
private String[] data;
public TableRow(String[] input)
{
data = input;
}
public String getData(int index)
{
if (index < 0 || index > data.length - 1)
throw new IllegalArgumentException("Invalid index: " + index + ". Minimum: 0, Maximum: " + (data.length - 1));
return data[index];
}
}
/**
* This class takes care of how the data is displayed in the table
*/
private static class TrimLabelProvider extends CellLabelProvider
{
@Override
public void update(ViewerCell cell)
{
/*
* This method is called by the TableViewer to get
* the String to display in the cell
*/
Object element = cell.getElement();
if (element instanceof TableRow)
{
int columnIndex = cell.getColumnIndex();
TableRow row = (TableRow) cell.getElement();
/* Here we trim the text */
cell.setText(shortenText(row.getData(columnIndex)));
}
}
private String shortenText(String text)
{
/* This is the maximal length we allow */
int value = 20;
if (text.length() > value)
{
int index = text.indexOf(" ", value);
if (index != -1)
return text.substring(0, index) + " [...]";
}
return text;
}
}
看起来是这样的:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.