import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Control;
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.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
public class TableItemEditor {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Table table = new Table(shell, SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
TableColumn column1 = new TableColumn(table, SWT.NONE);
TableColumn column2 = new TableColumn(table, SWT.NONE);
for (int i = 0; i < 10; i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText(new String[] { "item " + i, "edit this value" });
}
column1.pack();
column2.pack();
final TableEditor editor = new TableEditor(table);
// The editor must have the same size as the cell and must
// not be any smaller than 50 pixels.
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.minimumWidth = 50;
// editing the second column
final int EDITABLECOLUMN = 1;
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// Clean up any previous editor control
Control oldEditor = editor.getEditor();
if (oldEditor != null)
oldEditor.dispose();
// Identify the selected row
TableItem item = (TableItem) e.item;
if (item == null)
return;
// The control that will be the editor must be a child of the Table
Text newEditor = new Text(table, SWT.NONE);
newEditor.setText(item.getText(EDITABLECOLUMN));
newEditor.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent me) {
Text text = (Text) editor.getEditor();
editor.getItem().setText(EDITABLECOLUMN, text.getText());
}
});
newEditor.selectAll();
newEditor.setFocus();
editor.setEditor(newEditor, item, EDITABLECOLUMN);
}
});
shell.setSize(300, 300);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Gostaria de pegar todos os valores e salvar em um arquivo texto.
Nenhum deles.
Você tem que implementar o seu próprio (veja no link da minha assinatura). Então você só chama um método que retorna a lista de objetos da JTable.
Ou faz da forma mais difícil e não “reaproveitável”. Faz dois loops. Um de 0 até a quantidade de linhas, outro de 0 até a quantidade de colunas e vai pegando o objeto com getValueAt(linha, coluna).
[quote=fasts]Nenhum deles.
Você tem que implementar o seu próprio (veja no link da minha assinatura). Então você só chama um método que retorna a lista de objetos da JTable.
Ou faz da forma mais difícil e não “reaproveitável”. Faz dois loops. Um de 0 até a quantidade de linhas, outro de 0 até a quantidade de colunas e vai pegando o objeto com getValueAt(linha, coluna).[/quote]
Eu não uso JTable, uso o componente Table mesmo, por conta que é uma aplicação Eclipse RCP.
Os objetos não tem um método que exatamente me retorna uma lista com os valores atuais do TableEditor e nem Table.
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Color;
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.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
public class Editor {
private static Table table;
private static TableEditor editor;
public static void main(String[] args) {
Display display = new Display();
Shell parent = new Shell(display);
createTable(parent);
parent.open();
while (!parent.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
private static void createTable(Shell parent) {
table = new Table (parent, SWT.BORDER | SWT.MULTI);
table.setLinesVisible(true);
table.setHeaderVisible(true);
TableColumn column = null;
for(String col : new String[] { "Combo", "Text"}){
column = new TableColumn(table, SWT.NONE);
column.setText(col);
column.pack();
}
for (int i=0; i<2; i++) {
new TableItem (table, SWT.NONE);
}
TableItem [] items = table.getItems ();
for (int i=0; i<items.length; i++) {
editor = new TableEditor (table);
CCombo typeCombo = new CCombo (table, SWT.NONE);
typeCombo.setText("");
typeCombo.setEditable(false);
for(String type: new String[]{"","1","2","3","4"}){
typeCombo.add(type);
}
typeCombo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
showValues();
}
});
editor.grabHorizontal = true;
editor.setEditor(typeCombo, items[i], 0);
editor = new TableEditor (table);
Text shortNameText= new Text (table, SWT.NONE);
shortNameText.setText("");
shortNameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent arg0) {
showValues();
}
});
editor.grabHorizontal = true;
editor.setEditor(shortNameText, items[i], 1);
Color editorColor = shortNameText.getBackground();
typeCombo.setBackground(editorColor);
}
table.pack();
}
protected static void showValues() {
System.out.println("[showValues]");
// TODO Percorrer e mostrar no console valores preenchidos na table ou tableEditor
}
}
Acho que uma forma mais fácil de mostrar o que não estou conseguindo fazer, é mostrando o código acima, aonde toda vez que tiver alteração em uma das células eu preciso imprimir no console os valores da table ou editor.
Alguém tem ideia de como fazer a implementação do metodo showValues()?