如何将JTable中某个可编辑单元的改编后的值即时保存啊?

作者&投稿:辟委 (若有异议请与网页底部的电邮联系)
读取Jtable某个单元格的内容(刚刚被编辑的单元格)~

应该有两种情况:
第一 如果你的光标还停留在那个单元格,这时候JTable默认该单元格还没有结束编辑,不会保存当前的值。

第二 如果你的光标不在那个单元格了,这时候JTable应该会认为单元格已经结束编辑,所以会读取编辑后的值。

根据你的描述,你应该是第一种操作,那么你可在点击那个按钮的时候,强制Jtable结束编辑状态,一般可以通过jTable.getCellEditor().stopCellEditing()来实现,但是如果你的单元格设置默认的编辑器的话,就需要通过jTable1.getCellEditor(row,column).stopCellEditing()来实现


焦点简单理解其实就是:处于正在编辑或者在最顶层放置的组件。
就象你用word打开a.doc 和b.doc 你从编辑b.doc切换到编辑a.doc时a.doc就获得焦点。b就失去焦点。

看看这个例子吧。 要想保存改变后的状态 注意它的setValueAt方法

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

/**
* TableRenderDemo is just like TableDemo, except that it
* explicitly initializes column sizes and it uses a combo box
* as an editor for the Sport column.
*/
public class TableRenderDemo extends JPanel {
private boolean DEBUG = false;

public TableRenderDemo() {
super(new GridLayout(1,0));

JTable table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);

//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);

//Set up column sizes.
initColumnSizes(table);

//Fiddle with the Sport column's cell editors/renderers.
setUpSportColumn(table, table.getColumnModel().getColumn(2));

//Add the scroll pane to this panel.
add(scrollPane);
}

/*
* This method picks good column sizes.
* If all column heads are wider than the column's cells'
* contents, then you can just use column.sizeWidthToFit().
*/
private void initColumnSizes(JTable table) {
MyTableModel model = (MyTableModel)table.getModel();
TableColumn column = null;
Component comp = null;
int headerWidth = 0;
int cellWidth = 0;
Object[] longValues = model.longValues;
TableCellRenderer headerRenderer =
table.getTableHeader().getDefaultRenderer();

for (int i = 0; i < 5; i++) {
column = table.getColumnModel().getColumn(i);

comp = headerRenderer.getTableCellRendererComponent(
null, column.getHeaderValue(),
false, false, 0, 0);
headerWidth = comp.getPreferredSize().width;

comp = table.getDefaultRenderer(model.getColumnClass(i)).
getTableCellRendererComponent(
table, longValues[i],
false, false, 0, i);
cellWidth = comp.getPreferredSize().width;

if (DEBUG) {
System.out.println("Initializing width of column "
+ i + ". "
+ "headerWidth = " + headerWidth
+ "; cellWidth = " + cellWidth);
}

column.setPreferredWidth(Math.max(headerWidth, cellWidth));
}
}

public void setUpSportColumn(JTable table,
TableColumn sportColumn) {
//Set up the editor for the sport cells.
JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Knitting");
comboBox.addItem("Speed reading");
comboBox.addItem("Pool");
comboBox.addItem("None of the above");
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

//Set up tool tips for the sport cells.
DefaultTableCellRenderer renderer =
new DefaultTableCellRenderer();
renderer.setToolTipText("Click for combo box");
sportColumn.setCellRenderer(renderer);
}

class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
private Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath",
"Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour",
"Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne",
"Pool", new Integer(10), new Boolean(false)}
};

public final Object[] longValues = {"Sharon", "Campione",
"None of the above",
new Integer(20), Boolean.TRUE};

public int getColumnCount() {
return columnNames.length;
}

public int getRowCount() {
return data.length;
}

public String getColumnName(int col) {
return columnNames[col];
}

public Object getValueAt(int row, int col) {
return data[row][col];
}

/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}

/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}

/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}

data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}

private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();

for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TableRenderDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
TableRenderDemo newContentPane = new TableRenderDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}


如何将JTable中某个可编辑单元的改编后的值即时保存啊?
public class TableRenderDemo extends JPanel { private boolean DEBUG = false;public TableRenderDemo() { super(new GridLayout(1,0));JTable table = new JTable(new MyTableModel());table.setPreferredScrollableViewportSize(new Dimension(500, 70));table.setFillsViewportHeight(true);\/\/C...

java中怎么向jtable中连续插入一行数据,达到批量入库的功能
jTable1.setModel(new javax.swing.table.DefaultTableModel(object, string));写的方法对object二维数据赋值就行了。同样若是想把表中的数据读出来就是遍历object这个二维数组。

怎么把list中的数据显示在jtable中,并且实现换行(因为list中的数据正...
大概思想就是:单元格里面渲染JScrollPane,其上有个JTextArea,可以实现换行。具体例子如下:***\/import java.awt.Component;import java.util.ArrayList;import java.util.EventObject;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextArea;import...

java 怎样获得jtable中的选中行中的数据
首先假设两个JTable,他们为table1与table2 假设从table1取值放到table2中 1、获得table1的选中行 int index = table1.getSelectedRow();2、获得table1中列的个数 int column = table1.getColumnCount();3、取出表格中index行中的值,用集合保存!(1)创建一个保存的集合Vector<Vector<Object>> ...

...到的数据保存在ArrayList中,如果将他显示在Jtable表格中,谢谢_百度...
假定你的ArrayList中存放的javabean类型为:Bean ,名为list JTable 的数据为Object data[][]则可以这样写:for(int row=0; row<list.size(); row++){ data[row][0] = bean.getXX();data[row][1] = bean.getXX();...}

java 中如何让jTable的每一隔里的字符居中显示
class TestTable extends JFrame { TestTable() { init();} private void init() { String[][] data = new String[][]{{"1", "2", "3"},{"4", "5", "6"}, {"7", "8", "9"}};String[] columnName = new String[]{"1", "2", "3"};DefaultTableModel tableModel ...

java中JTable怎么设置选中表格的其中一行,通过java语言进行选中_百度...
假设JTable table已实例化,设置选中表格中的行:table.setRowSelectionInterval(int index0,int index1)\/\/选择从 index0 到 index1 之间(包含两端)的行。table.setRowSelectionInterval(0,0);\/\/表示选中第一行

怎样用Java实现将在数据库中查询到的数据显示在表格中
TableModel是一个接口,实际上返回的是DefaultTableModel类,它实现了TableModel接口。这个类中有一个方法是void addRow(Object[] rowData)。它就是将一行插入到JTable中。不过JTable的setValueAt方法应该就可以实现。楼主可以定义个一个线程类来完成。比如你需要插入100行数据,可以在线程的run方法中写一...

如何在JTable的一个单元格中嵌入下拉框
你可以自己做一个JTable的子类,然后覆盖他的方法getCellEditor(int row,int col),在你的子类你可以设计一个方法,允许用户设置指定的一个cell使用下拉框编辑器,然后再你覆盖的方法中,判断当前请求编辑的cell,是不是你指定的,如果是则返回下拉框编辑器. 如果你需要对多个单元指定不同的下拉框编辑器,那...

java中jatable连接数据库步骤及其获取数据方法
\/\/ 将JTable加入到带滚动条的面板中 this.scpDemo.getViewport().add(tabDemo);}catch(ClassNotFoundException cnfe){ JOptionPane.showMessageDialog(null,"数据源错误","错误",JOptionPane.ERROR_MESSAGE);}catch(SQLException sqle){ JOptionPane.showMessageDialog(null,"数据操作错误","错误",...

布尔津县19342198378: java的JTable如何为指定的某一个单元格添加数据? -
锐詹黄龙: jtable.setValueAt(行号,列号)记得行号和列号都是从0开始的如(0,0)就是指第一行的第一列

布尔津县19342198378: 如何使得jTable中处于编辑状态的单元格中的内容也被记录而不需要再改变焦点后才能获得 -
锐詹黄龙: 焦点简单理解其实就是:处于正在编辑或者在最顶层放置的组件.就象你用word打开a.doc 和b.doc 你从编辑b.doc切换到编辑a.doc时a.doc就获得焦点.b就失去焦点.

布尔津县19342198378: 如何使得jtable可编辑
锐詹黄龙: JTABLE默认是可以编辑的假如设置弗成编辑可手动覆盖isCellEditable()办法返回false即可也可以设置某些列式可以弗成编辑的.欲望能赞助你

布尔津县19342198378: 如何用js实现点击按钮使table某一单元格变为可编辑状态 -
锐詹黄龙: 具体步骤 1.复制原来那个单元格里面的内容到一个变量 2.将那个单元格的内容替换为一个输入框(input) 3.将那个变量的内容赋值给输入框反向操作: 1.取得输入框里的内容并赋值给一个变量 2.将单元格清空,并将那个变量的值填写到单元格里

布尔津县19342198378: JAVA JTable编辑单元格问题 -
锐詹黄龙: 应该先改为可编辑状态,再激活.table.editCellAt(int row,int col);table.focus();

布尔津县19342198378: 如何使得jtable可编辑? -
锐詹黄龙: JTABLE默认是可以编辑的 如果设置不可编辑可手动覆盖isCellEditable()方法,返回false即可,也可以设置某些列式可以不可编辑的.希望能帮助你.

布尔津县19342198378: 如何让Jtable不可编辑? -
锐詹黄龙: 如何控制JTable各行各列能被选择,但是单元格中的内容不被修改? 昨天晚上仔细研究了一下,发现针对此问题,网上有很多回答有不当之处,估计大多是copy来copy去,自己并没有进行测试! JTable类下有一个子类:DefaultTableModel....

布尔津县19342198378: JTable中要怎么设置成不可编辑的单元格啊! -
锐詹黄龙: 继承JTable类,然后重载isCellEditable方法,再用这个类实现.感觉有些烦琐.后又看到又用内部类实现的.这才感觉比较方便.然后,我也需要使用TableModel,所以,自己想了想用内部类方法重载DefaultTableModel,试了试,也可以实现...

布尔津县19342198378: java中jTable某一行是否可编辑 -
锐詹黄龙: 类似这样:tableModel = new DefaultTableModel(rulelist,columnName){private static final long serialVersionUID = 1L; public boolean isCellEditable(int row,int column){if(isadding &&(row==ruleNumber-1)){ return true;}else if (ismodifying &&(row=...

布尔津县19342198378: 在JTable中修改单元格并返回数据库 -
锐詹黄龙: JTable的单元格可以修改,而且可以监听单元格修改事件,实现TableModelListener的public void tableChanged(TableModelEvent e)方法,监听到单元格修改后,在响应函数中把修改后的值传入数据库就ok了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网