- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个包含两列的 TableViewer,我想在按下名为“添加”的按钮后向其中添加行。按下按钮后,我想创建一个空行,第一列单元格将提供输入文本的选项,第二列单元格将提供在系统目录中浏览以选择文件夹的选项。
单击“添加”按钮后,我成功添加了一个空行,但它返回以下错误:发生错误。有关更多详细信息,请参阅错误日志。断言失败:第 0 列没有标签提供程序。表查看器的用途是在第一列单元格中插入字符串变量,在第二列单元格中插入路径。使用用户插入的数据,我想创建一个名为 ProjectDirectory 的类的列表(该类有两个 String 属性)。
我还设法删除了用鼠标选择的行,效果很好。
我是使用 Jface 和 SWT 的新手,我不知道如何做到这一点。有人可以帮我吗?
代码:
Composite tableComposite = new Composite(pluginPathCreatedComposite, SWT.NONE);
FormData tableCompositeData = new FormData();
tableCompositeData.left = new FormAttachment(selectProjectPathLabel, 0, SWT.LEFT);
tableCompositeData.top = new FormAttachment(selectProjectPathLabel, 40, SWT.TOP);
tableCompositeData.right = new FormAttachment(selectProjectPathButton,-10,SWT.LEFT);
tableCompositeData.bottom = new FormAttachment(createProjectConfigButton,-10,SWT.TOP);
tableComposite.setLayoutData(tableCompositeData);
//Create the tableviewer
tableViewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
Table table = tableViewer.getTable();
tableViewer.getTable().setLinesVisible(true);
tableViewer.getTable().setHeaderVisible(true);
tableViewer.setColumnProperties(COLUMN_HEADINGS);
//Create the tableViewer columns
TableViewerColumn variable = new TableViewerColumn(tableViewer, SWT.NONE);
variable.getColumn().setText(COLUMN_HEADINGS[0]);
variable.getColumn().setResizable(false);
TableViewerColumn path = new TableViewerColumn(tableViewer, SWT.NONE);
path.getColumn().setText(COLUMN_HEADINGS[1]);
path.getColumn().setResizable(false);
TableColumnLayout tableLayout = new TableColumnLayout();
tableComposite.setLayout(tableLayout);
//Set the columns proportions
tableLayout.setColumnData(path.getColumn(), new ColumnWeightData(50));
tableLayout.setColumnData(variable.getColumn(), new ColumnWeightData(50));
//Set the first row as TextCell (this doesn´t work)
CellEditor[] editors = new CellEditor[2];
editors[0] = new TextCellEditor(tableViewer.getTable());
editors[1] = new TextCellEditor(tableViewer.getTable());
tableViewer.setCellEditors(editors);
//Add button
Button addRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData addRowData = new FormData();
addRowData.top = new FormAttachment(tableComposite,0,SWT.TOP);
addRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
addRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
addRow.setLayoutData(addRowData);
addRow.setText("Add");
addRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ProjectDirectory directory = new ProjectDirectory("A", "A");
Table table = tableViewer.getTable();
tableViewer.add(directory);
table.setTopIndex(table.getItemCount());
table.select(table.getItemCount() - 1);
}
});
//Delete row
Button deleteRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData deleteRowData = new FormData();
deleteRowData.top = new FormAttachment(addRow,5,SWT.BOTTOM);
deleteRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
deleteRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
deleteRow.setLayoutData(deleteRowData);
deleteRow.setText("Delete");
deleteRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ISelection selection = tableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Iterator iterator = ((IStructuredSelection) selection).iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
tableViewer.remove(obj);
}
}
}
});
图片:
编辑:
我已经创建了一个内容提供程序来获取代码中创建的列表的 ProjectDirectories(我将来会更改它)。之后,我为每一列创建了一个标签提供程序,它按照我想要的方式显示数据。
事实上,我想在按下添加按钮后在表格中添加一个新行,并且我想让第一个单元格成为 TextCellEditor (第二个单元格将有一个事件来打开系统的目录路径,如下所示)图像之一,但在执行此操作之前我还想将其设为 TextCellEditor)。我已经定义这两列将像 TextCell 编辑器一样,在按下添加按钮后,我成功添加了一个空行,但我无法在其中输入文本。我还创建了一个 setCellModifier 来更新表查看器。我做错了什么?
代码
Composite tableComposite = new Composite(pluginPathCreatedComposite, SWT.NONE);
FormData tableCompositeData = new FormData();
tableCompositeData.left = new FormAttachment(selectProjectPathLabel, 0, SWT.LEFT);
tableCompositeData.top = new FormAttachment(selectProjectPathLabel, 40, SWT.TOP);
tableCompositeData.right = new FormAttachment(selectProjectPathButton,-10,SWT.LEFT);
tableCompositeData.bottom = new FormAttachment(createProjectConfigButton,-10,SWT.TOP);
tableComposite.setLayoutData(tableCompositeData);
tableViewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
table = tableViewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);
tableViewer.setColumnProperties(COLUMN_HEADINGS);
//Content provider
tableViewer.setContentProvider(new ProjectConfigTableContentProvider());
/*I have tried to use this instead of setting the label providers in the column definitions*/
//tableViewer.setLabelProvider(new ProjectConfigTableLabelProvider());
//Label provider setted in each column
TableViewerColumn variable = new TableViewerColumn(tableViewer, SWT.NONE);
variable.getColumn().setText(COLUMN_HEADINGS[0]);
variable.getColumn().setResizable(false);
variable.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element) {
if(element instanceof ProjectDirectory && element != null)
return ((ProjectDirectory)element).getName();
return super.getText(element);
}
});
TableViewerColumn path = new TableViewerColumn(tableViewer, SWT.NONE);
path.getColumn().setText(COLUMN_HEADINGS[1]);
path.getColumn().setResizable(false);
path.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element) {
if(element instanceof ProjectDirectory && element != null)
return ((ProjectDirectory)element).getPath();
return super.getText(element);
}
});
//List created in code (will change this in the future)
List<ProjectDirectory> b = new ArrayList<ProjectDirectory>();
b.add(new ProjectDirectory("AA", "FF"));
b.add(new ProjectDirectory("BB", "CC"));
Project pro = new Project("A", "B", 2, b);
//Input setted
tableViewer.setInput(pro);
TableColumnLayout tableLayout = new TableColumnLayout();
tableComposite.setLayout(tableLayout);
tableLayout.setColumnData(path.getColumn(), new ColumnWeightData(50));
tableLayout.setColumnData(variable.getColumn(), new ColumnWeightData(50));
CellEditor[] editors = new CellEditor[2];
editors[0] = new TextCellEditor(table);
editors[1] = new TextCellEditor(table);
tableViewer.setCellEditors(editors);
tableViewer.setCellModifier(new ProjectConfigTableCellModifier(COLUMN_HEADINGS,tableViewer));
//addrow button
Button addRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData addRowData = new FormData();
addRowData.top = new FormAttachment(tableComposite,0,SWT.TOP);
addRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
addRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
addRow.setLayoutData(addRowData);
addRow.setText("Add");
addRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ProjectDirectory directory = new ProjectDirectory("", "");
tableViewer.add(directory);
table.setTopIndex(table.getItemCount());
table.select(table.getItemCount() - 1);
tableViewer.editElement(directory, 0);
}
});
我还创建了一个 labelProvider 类,以避免像我所做的那样在每列中设置标签提供程序,但它不起作用。代码是这样的:
@Override
public String getColumnText(Object element, int columnIndex) {
// TODO Auto-generated method stub
ProjectDirectory projectDirectory = (ProjectDirectory) element;
switch (columnIndex) {
case 0:
return projectDirectory.getName();
case 1:
return projectDirectory.getPath();
}
return null;
}
对类的调用是这样的:
tableViewer.setLabelProvider(new ProjectConfigTableLabelProvider());
为什么只有将标签提供程序设置到列才有效,而这种方式不起作用?
最佳答案
好的,我已经找到解决问题的方法了。
首先,我创建了一个组合,它将在更大的组合中包含表格。
private Composite createPluginPathCreatedComposite(){
.................................
//Label of bigger composite
Text selectProjectPathText = new Text(pluginPathCreatedComposite, SWT.BORDER);
selectProjectPathText.setEnabled(false);
FormData selectProjectPathTextData = new FormData();
selectProjectPathTextData.top = new FormAttachment(selectProjectPathLabel, 0, SWT.CENTER);
selectProjectPathTextData.left = new FormAttachment(selectProjectPathLabel, 5,SWT.RIGHT);
selectProjectPathTextData.right = new FormAttachment(100,-55);
selectProjectPathText.setLayoutData(selectProjectPathTextData);
//Button to select a system directory
Button selectProjectPathButton = new Button(pluginPathCreatedComposite, SWT.NONE);
selectProjectPathButton.setText("Browse");
FormData selectProjectPathButtonData = new FormData();
selectProjectPathButtonData.top = new FormAttachment(selectProjectPathText, 0, SWT.TOP);
selectProjectPathButtonData.left = new FormAttachment(selectProjectPathText, 5, SWT.RIGHT);
selectProjectPathButtonData.right = new FormAttachment(100,-5);
selectProjectPathButton.setLayoutData(selectProjectPathButtonData);
selectProjectPathButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(Display.getCurrent().getActiveShell());
dialog.setFilterPath(""); // Windows specific
selectProjectPathText.setText(dialog.open());
}
});
//Create a composite for the table inside a bigger composite pluginPathCreatedComposite
Composite tableComposite = new Composite(pluginPathCreatedComposite, SWT.NONE);
FormData tableCompositeData = new FormData();
tableCompositeData.left = new FormAttachment(selectProjectPathLabel, 0, SWT.LEFT);
tableCompositeData.top = new FormAttachment(selectProjectPathLabel, 40, SWT.TOP);
tableCompositeData.right = new FormAttachment(selectProjectPathButton,-10,SWT.LEFT);
tableCompositeData.bottom = new FormAttachment(createProjectConfigButton,-10,SWT.TOP);
tableComposite.setLayoutData(tableCompositeData);
//Function to create the table.
createTable(tableComposite,selectProjectPathText);
//add row to the tableviewer
addRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ProjectDirectory directory = new ProjectDirectory("Insert variable", "Click to add path");
projectCompositeViewer.add(directory);
}
});
//deleterow from the tableviewer
Button deleteRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData deleteRowData = new FormData();
deleteRowData.top = new FormAttachment(addRow,5,SWT.BOTTOM);
deleteRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
deleteRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
deleteRow.setLayoutData(deleteRowData);
deleteRow.setText("Delete");
deleteRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ISelection selection = projectCompositeViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Iterator iterator = ((IStructuredSelection) selection).iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
projectCompositeViewer.remove(obj);
}
}
}
});
}
创建表函数,我已传递表 Composite 和项目文件夹的路径作为参数:
private void createTable(Composite tableComposite, Text selectProjectPathText){
//Create the tableViewer and it´s columns
projectCompositeViewer = new ProjectConfigViewer(tableComposite, selectProjectPathText,SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
//Create an input to display
List<ProjectDirectory> b = new ArrayList<ProjectDirectory>();
b.add(new ProjectDirectory("AA", "FF"));
b.add(new ProjectDirectory("BB", "CC"));
Project pro = new Project("A", "B", 2, b);
projectCompositeViewer.setInput(pro);
}
ProjectConfigViewer代码:
public class ProjectConfigViewer extends TableViewer{
public ProjectConfigViewer(Composite parent, Text selectProjectPathText,int style)
{
super(parent, style);
Table table = getTable();
createColumns(parent, selectProjectPathText);
table.setHeaderVisible(true);
table.setLinesVisible(true);
//Specify Content provider
setContentProvider(new ProjectConfigTableContentProvider());
}
//Create the columns, column´s label providers and editingsuport to specify how will each column cell be: text column, dialog column...
private void createColumns(Composite parent,Text selectProjectPathText)
{
String[] COLUMN_HEADINGS = {"Variable", "Path"};
TableColumnLayout tableLayout = new TableColumnLayout();
parent.setLayout(tableLayout);
//Specify first column labelprovider and create it
TableViewerColumn variable = createTableViewerColumn(COLUMN_HEADINGS[0], 0);
variable.getColumn().setResizable(false);
variable.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element) {
if(element instanceof ProjectDirectory && element != null)
return ((ProjectDirectory)element).getName();
return super.getText(element);
}
});
//Specify second column labelprovider and create it
TableViewerColumn path = createTableViewerColumn(COLUMN_HEADINGS[1], 1);
path.getColumn().setResizable(false);
path.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element) {
if(element instanceof ProjectDirectory && element != null)
return ((ProjectDirectory)element).getPath();
return super.getText(element);
}
});
//Spedify the dimensions of each column
tableLayout.setColumnData(path.getColumn(), new ColumnWeightData(50));
tableLayout.setColumnData(variable.getColumn(), new ColumnWeightData(50));
//Specify setEditingSupport for each cell. First cell will be text, second will be a Dialog.
variable.setEditingSupport(new ProjectConfigVariableEditingSupport(this));
path.setEditingSupport(new ProjectConfigPathEditingSupport(this, selectProjectPathText));
}
//Create tableviewercolumns
private TableViewerColumn createTableViewerColumn(String header, int idx)
{
TableViewerColumn column = new TableViewerColumn(this, SWT.LEFT, idx);
column.getColumn().setText(header);
column.getColumn().setResizable(true);
column.getColumn().setMoveable(true);
return column;
}
}
内容提供商:
public class ProjectConfigTableContentProvider implements IStructuredContentProvider {
private List<ProjectDirectory> projectEntitiesList;
@Override
public Object[] getElements(Object arg0) {
// TODO Auto-generated method stub
if (arg0 instanceof Project){
Project project = (Project) arg0;
if (project != null && project.getProjectDirectoriesList() != null){
initializeTableProjectConfig(project);
return projectEntitiesList.toArray();
}
}
projectEntitiesList = new ArrayList<ProjectDirectory>();
return projectEntitiesList.toArray();
}
private void initializeTableProjectConfig(Project project){
try {
List<ProjectDirectory> listProjectDirectory = new ArrayList<ProjectDirectory>();
for (ProjectDirectory projectDirectory : project.getProjectDirectoriesList()) {
if (projectDirectory != null)
listProjectDirectory.add(projectDirectory);
}
this.projectEntitiesList = listProjectDirectory;
} catch (Exception e) {
e.printStackTrace();
}
}
}
第一列的编辑支持:
public class ProjectConfigVariableEditingSupport extends EditingSupport {
private TextCellEditor cellEditor;
public ProjectConfigVariableEditingSupport(ColumnViewer viewer) {
super(viewer);
cellEditor = new TextCellEditor(((TableViewer)viewer).getTable());
}
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
protected boolean canEdit(Object element) {
return true;
}
protected Object getValue(Object element) {
return ((ProjectDirectory) element).getName();
}
@Override
protected void setValue(Object element, Object value) {
((ProjectDirectory) element).setName(String.valueOf(value));
getViewer().update(element, null);
}
}
第二列的编辑支持:
public class ProjectConfigPathEditingSupport extends EditingSupport{
private DialogCellEditor cellEditor;
//Pass selecProjectPathText of the bigger composite to brose from that directory
public ProjectConfigPathEditingSupport(ColumnViewer viewer, Text selectProjectPathText) {
super(viewer);
cellEditor = new DialogCellEditor(((TableViewer)viewer).getTable()) {
@Override
protected Object openDialogBox(Control cellEditorWindow) {
// TODO Auto-generated method stub
DirectoryDialog dialog = new DirectoryDialog(cellEditorWindow.getShell());
dialog.setText("Browse");
dialog.setFilterPath(selectProjectPathText.getText()); // Windows specific
return dialog.open();
}
};
}
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
protected boolean canEdit(Object element) {
return true;
}
protected Object getValue(Object element) {
return ((ProjectDirectory) element).getPath();
}
protected void setValue(Object element, Object value)
{
((ProjectDirectory) element).setPath(String.valueOf(value));
getViewer().update(element, null);
}
}
模型类:
public class Project {
private String name;
private String path;
private Integer quantity;
private List<ProjectDirectory> projectDirectoryList;
//Constructor
public Project(String name, String path, Integer quantity, List<ProjectDirectory> projectDirectoriesList) {
super();
this.name = name;
this.path = path;
this.quantity = quantity;
this.projectDirectoryList = projectDirectoriesList;
}
//GETTERS AND SETTERS
}
public class ProjectDirectory {
private String name;
private String path;
//Constructor
public ProjectDirectory(String name, String path) {
super();
this.path = path;
this.name = name;
}
//Getters & setters
关于java - 在 TableViewer 中添加、编辑、删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40042821/
我正在对 tableView 是否呈现单元格进行单元测试。 我发现 tableView.cellForRow(at:) 返回 nil,而 tableView.dataSource?tableView(
我有 Tableview 用于显示客户下的食品订单。其中包含水平 UIStackview。在 UIStackView UIStackview 中很少有一/两行标签和一个用于显示订单项的UITableV
我有 Viewcontroller,我在其中设置了 ScrollView 。在 scrollview 中,我有一个 tableview,它位于 Container 中,就在容器下方,当我将 table
我想在滚动时让我的第一个单元格始终位于 tableview 的顶部。 任何帮助都是可观的。提前致谢... 最佳答案 这是为 UITableView 创建标题 View 的方法 - (UIView *)
在我的应用程序中,我点击一行,它会在其下方展开另一行。我想生成一种随机颜色,当我单击一行时,行背景会变成该颜色,而它下面的展开行会变成相同的颜色。如何让行生成相同的随机颜色? 我创建了一个函数来生成随
我正在为这个问题苦苦挣扎,所以我需要你的帮助。基本上我已经编写了一个复杂的 TableView Controller (使用 NSFetchedResults 协议(protocol)等)并且已经在我
我正在使用 JavaFx 2.2。我遇到了一个问题,我无法在 TableView 列中放置不同的组件。例如我有两列 1) 回答 2) 答案类型 如果 AnswerType 包含“Multiple Ch
试图弄清楚如何在 javafx 2 中禁用表列的重新排序? 最佳答案 这是解决方案: tblView.getColumns().addListener(new ListChangeListener()
我一直在寻找有关将数据刷新到 tableview 的信息。我试图直接修改模型,但我遇到了一个错误。我修改了模型,但表格没有刷新,只有当我移动一列时,表格才会显示修改后的值。 为了给你展示一个例子(13
给定一个TableView,我需要检测单元格上的双击。 tableView.setOnMouseClicked(new EventHandler() { @Override publi
我成功创建了一个 TableView,其中将特定列分配给了数据模型类。该程序可以将 csv 文件解析为其中并在表中正确显示所有内容。在此阶段,滚动不是问题。 然后我想选择特定行并将它们发送到另一个表。
我尝试了所有方法来用数据填充 TableView。下一个代码在表中插入一个新行,但数据没有出现在表中。我试图为此找到解释,但没有成功。 请帮忙。我不知道怎么了。 在 controller.java 中
我尝试了所有方法来用数据填充 TableView。下一个代码在表中插入一个新行,但数据没有出现在表中。我试图为此找到解释,但没有成功。 请帮忙。我不知道怎么了。 在 controller.java 中
我有一个通过 Tableview 显示玩家的应用程序。用户可以“添加”一个新玩家并输入他的姓名、高度、体重、图片等...保存后将被添加到 Tableview 中。他们还可以点击每个玩家,然后将他们带到
对于大学,我必须编写一个小应用程序,其想法是创建一个小公式集合。这个概念是有一个类别列表,选择类别后您会收到一个公式列表。选择所需的公式后,您将看到公式计算器的 View 。 我正在努力获得第一个UI
如果我只加载一个 TableView ,我的 View 中必须有两个 TableView ,它工作正常。但是当我尝试使用下面的方法加载两个表格 View 时,它给出了以下异常。 未捕获异常“NSRan
我是 JavaFx 的新手,我正在尝试创建一个 TableView ,而 fxml 是使用场景生成器创建的。如果我运行该程序,该表不会获取值。我发现这个问题在某种程度上符合我的要求( javaFX 2
是否可以对 tableView 进行反向排序?我搜索了很多解决方案,但没有任何效果。 效果就像whatsapp聊天。 一个普通的tableView是: ---------- label 1 -----
我有一个有趣的问题。我有两个 TableView ,一个在另一个里面。我有一个结构,我想用它来将数据添加到我的 TableView 中。该结构有 2 个字符串项和另一个具有 3 个字符串项的结构的数组
我正在使用的方法 func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath
我是一名优秀的程序员,十分优秀!