我有一个 Eclipse RCP 应用程序,想要在TableViewerusing ColumnWeigthDataas中使用动态列大小ColumnLayoutData。问题是,每当我布局表格时,父表单(ScrolledForm在示例代码中)都会增加几个像素。
要重现,您可以运行该示例并打开/关闭该部分几次。每次关闭时,该部分都会变得更宽。
为什么会这样?我怎样才能让它停止?
package com.test;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
public class TestShell extends Shell {
private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
private final Table table;
public static void main(final String args[]) {
try {
final Display display = Display.getDefault();
final …Run Code Online (Sandbox Code Playgroud) 我正在尝试从表格中的数据创建一个arraylist.我需要从可见列中获取值,但我还需要从表中不可见的列中获取值.使用SWT和Table Viewer,我不知道如何不在表格中显示列.我也不知道如何通过指定列名来从表中提取数据.
我一直使用Swing,所以我一直使用Table Model Class.在swing中,创建列,隐藏它们并从中获取数据非常简单.
这就是我在以前的Swing项目中完成它的方法.
在我的表模型类中:
public String getColumnName(int column) {
String s = null;
switch (column) {
case ITEMID_COL: {
s = "ItemId";
break;
}
Run Code Online (Sandbox Code Playgroud)
那么 getValueAt()
public Object getValueAt(int row, int column) {
Object o = null;
try {
switch (column) {
case ITEMID_COL: {
o = rds.get(row).rev.getItem().getStringProperty("item_id");
break;
}
Run Code Online (Sandbox Code Playgroud)
因此,当我需要其他课程中的表格中的数据时,我所要做的就是
Object item_id = SingletonSelectTable.getInstance().getValueAt(i, SingletonSelectTable.getInstance().ITEMID_COL);
Run Code Online (Sandbox Code Playgroud)
我也可以通过设置来轻松隐藏列MAX_COLUMNS.
问题:
我需要学习如何向表中添加不会显示但仍使用表查看器包含值的列.
我需要学习如何从表中访问值,因此我可以从列中创建可见和不可见数据的数组.
这甚至可以使用表格查看器吗?
我目前正在开发一个Eclipse RCP应用程序,它显示多个TableViewer包含可编辑单元格的应用程序.这些单元通过EMF数据绑定连接到我的模型.
现在我希望编辑后的单元格呈绿色闪烁,这意味着将背景颜色设置为绿色然后淡出.为了方便入门,我想将单元格背景颜色设置为绿色,然后在1秒后恢复为白色.
原因之一是将背景颜色设置为绿色,但我不能让它在一秒钟后重新设置为白色,因为ViewerCell我正在编辑的时间被自动设置为null,我不知道为什么.
这是我的代码提取(不起作用)CellLabelProvider:
@Override
public void update(final ViewerCell cell) {
//this works:
cell.setBackground(new Color(Display.getCurrent(), 0, 255, 0));
Display.getCurrent().timerExec(1000, new Runnable() {
public void run() {
//for this I get a NullPointerException:
cell.setBackground(new Color(Display.getCurrent(), 255, 255, 255));
}
});
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!
我已经根据Vogella 的说明(转载如下)实现了 JFace 的 TableViewer 排序。碰巧排序仅在图形界面中进行(它没有反映在原始数据结构中),并且我需要按照元素在 GUI 中显示的顺序获取元素。
或者,反映原始数据结构中的排序的实现也适合。
package de.vogella.jface.tableviewer.sorter;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import de.vogella.jface.tableviewer.model.Person;
public class MyViewerComparator extends ViewerComparator {
private int propertyIndex;
private static final int DESCENDING = 1;
private int direction = DESCENDING;
public MyViewerComparator() {
this.propertyIndex = 0;
direction = DESCENDING;
}
public int getDirection() {
return direction == 1 ? SWT.DOWN : SWT.UP;
}
public void setColumn(int column) {
if (column == this.propertyIndex) {
// Same column as last …Run Code Online (Sandbox Code Playgroud) 我正在研究JFace Tableviewer.我对ColumnLabelProvider和的用法有点困惑ITableLabelProvider.我试图为tableviewer中的某一行着色(其中有1列字符串和其他3列中的复选框图像).我已经实现ITableLabelProvider并着色了该行,但在此之后禁用了编辑支持.所以我很困惑我是否应该使用ColumnLabelProvider或ITableLabelProvider?
有人可以给我一些想法吗?提前致谢
编辑:这是基于Max的建议的代码
editor.getControl().addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
Table table = viewer.getTable();
int currentIndex = table.getSelectionIndex();
if (e.keyCode == SWT.ARROW_DOWN) {
if (currentIndex != table.getItemCount() - 1) {
table.setSelection(currentIndex+1);
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
Object rowObj = sel.getFirstElement();
viewer.editElement(rowObj, columnIndex);
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
我有一个JFace TableViewer,其列可编辑(通过实现完成EditingSupport).
我希望用户能够在编辑单元格时按向上/向下箭头移动到其上方/下方的行.这就是我所拥有的:
final TextCellEditor editor = new TextCellEditor(viewer.getTable());
editor.getControl().addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.keyCode == SWT.ARROW_DOWN) {
Table table = viewer.getTable();
int currentIndex = table.getSelectionIndex(); …Run Code Online (Sandbox Code Playgroud) 我认为这个问题很常见.
最近我有一个要求,我需要做一个水平或可扩展的表格视图.如果您需要一个示例,可以参考Mac OS X的活动监视器:

与此同时,我在这里尝试了一个例子,它满足了我的要求:
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/SWTTreeWithMulticolumns.htm
但是它有一些问题:1.它使用SWT的Tree类而不是JFace类; 2.我认为它需要重复实现一些JFace查看器类的功能,例如通过单击列标题,过滤器等进行排序.
当我感到绝望时,我发现Eclipse本身有一个完美的视图,它的"问题"视图:

所以我认为必须有一种优雅的方式,例如扩展JFace TableViewer或TreeViewer类.
但我需要帮助,因为我在谷歌搜索了很多没有好结果.:-(
另一个类似的StackOverflow问题帮助我达到了一定程度.
我的TableViewer单元格包含布尔小部件editors(不是通常的检查按钮小部件,而是一个切换按钮,可以是"已选中"/"未选中").
该表必须:
- 在选择单元格时始终显示编辑器;
- 当细胞焦点丢失时禁用编辑器;
- 按下row时正确移动到下一个TAB;

显然很容易,在实践中很难.很多听众的冲突(TAB并没有真正起作用).
稍后编辑:
我已经设法解决了大多数错误,但是这一个错误仍然令我难以理解.如果我用鼠标更改小部件的值,然后按TAB以遍历,焦点将跳转到下一行,而不是下一行.但是,如果我使用空格键更改编辑器的值,那么遍历工作正常; 它应该跳到下一行.
我应该如何调试那些该死的听众?
具体用途是ColumnViewerTooltipSupport什么?我知道它提供了工具提示支持,ColumnViewers但它是否意味着它为treeViewers提供了工具提示?当鼠标悬停在每个项目上时,如何使用此功能为每个树项目提供工具提示支持单独的不同工具提示?我是否需要MouseListener这个或ColumnViewerTooltipSupport默认情况下课程提供吗?有人可以帮助我,因为我对SWT概念比较陌生.
我的工具提示有多行,如何包装文本并整齐地显示?ColumnViewerToolTipSupport如果文本太长,似乎类不会包装工具提示文本.我想使用带有垂直滚动条的工具提示窗口,就像eclipse中的InformationControl Windows一样?如果像日食这样的东西是不可能的,那么只需要一个包含文本的工具提示窗口.
请给我看一个示例代码段?

我想向选择按钮添加一个侦听器,该按钮获取在清单表查看器中选择的多行。然后它会继续检查这些框。我的问题是如何获取在表查看器中选择的行列表?
这是该表的代码:
private void createCheckViewer(Composite parent){
tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.MULTI| SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
if ( (GanttFrame.getListOfFunctionTasks()!= null)){
if (!(GanttFrame.getListOfFunctionTasks().isEmpty())){
// Data Rows
for (int i = 0; i < GanttFrame.getListOfFunctionTasks().size(); i++) {
tableViewer.add(GanttFrame.getListOfFunctionTasks().get(i));
GanttFrame.getListOfFunctionTasks().get(i).setCheckId(i);
}
}
}
// flow trace or function trace
String columnHeader;
if (TraceData.getFlowTraceFlag()){
columnHeader = "Flow Traces";
}else{
columnHeader = "Function Traces";
}
// define layout for the viewer
gridData = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
gridData.heightHint = 400;
tableViewer.getControl().setLayoutData(gridData); …Run Code Online (Sandbox Code Playgroud) tableviewer ×10
jface ×8
swt ×7
java ×6
eclipse ×2
blink ×1
eclipse-rcp ×1
sorting ×1
tree ×1
treeviewer ×1
widget ×1