JTable编辑问题

oZouBianBian 2013-03-31 09:11:55

package pms.client.ui.dlg;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.rmi.RemoteException;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;

import javax.swing.CellEditor;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import org.apache.log4j.Logger;

import pms.client.main.ClientContext;
import pms.client.util.ClientConfigReader;
import pms.client.util.PmsDictionary;
import pms.common.util.CommonUtil;

public class DlgSetParameter extends JDialog implements ActionListener{
static Logger logger=Logger.getLogger(DlgSetParameter.class);
JTabbedPane configure=new JTabbedPane();
JPanel mainPanel=new JPanel();
JPanel buttonPanel_server=new JPanel(new FlowLayout());
JPanel buttonPanel_client=new JPanel(new FlowLayout());
JButton btnOK_server=new JButton("确定");
JButton btnCancel_server=new JButton("取消");
JButton btnOK_client=new JButton("确定");
JButton btnCancel_client=new JButton("取消");
JScrollPane jsp_client=new JScrollPane();
JScrollPane jsp_server=new JScrollPane();
JTable serverconfigTable=new JTable();
JTable clientconfigTable=new JTable();
JPanel serverconfigPanel=new JPanel(new BorderLayout());
JPanel clientconfigPanel=new JPanel(new BorderLayout());
public DlgSetParameter(Window window){
super(window);
jbInit();
}

private void jbInit(){

buttonPanel_client.setPreferredSize(new Dimension(300,80));
buttonPanel_server.setPreferredSize(new Dimension(300,80));
btnCancel_client.setPreferredSize(new Dimension(60,22));
btnCancel_server.setPreferredSize(new Dimension(60,22));
btnOK_server.setPreferredSize(new Dimension(60,22));
btnOK_client.setPreferredSize(new Dimension(60,22));
btnOK_client.addActionListener(this);
btnOK_server.addActionListener(this);
btnCancel_client.addActionListener(this);
btnCancel_server.addActionListener(this);
try {
serverconfigTable.setModel(new ParameterModel(ClientContext.getcCommonQueryIFC().findServerconfig()));
} catch (RemoteException e) {
logger.error(e);
}
clientconfigTable.setModel(new ParameterModel(ClientConfigReader.getProperties()));
clientconfigTable.addMouseListener(new MouseAdapter(){

@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(e.getClickCount()==1){
if(clientconfigTable.isEditing()){
int row_edit=clientconfigTable.getSelectedRow();
int col_edit=clientconfigTable.getSelectedColumn();
CellEditor ce = clientconfigTable.getCellEditor(row_edit, col_edit);
ce.stopCellEditing();
Object value = ce.getCellEditorValue();
DefaultTableModel tableModel = (DefaultTableModel)clientconfigTable.getModel();
tableModel.fireTableDataChanged();
}
}
}
});
jsp_client.getViewport().add(clientconfigTable);
jsp_server.getViewport().add(serverconfigTable);
buttonPanel_client.add(btnOK_client);
buttonPanel_client.add(btnCancel_client);
buttonPanel_server.add(btnOK_server);
buttonPanel_server.add(btnCancel_server);
clientconfigPanel.add(jsp_client,BorderLayout.CENTER);
clientconfigPanel.add(buttonPanel_client,BorderLayout.SOUTH);
serverconfigPanel.add(jsp_server,BorderLayout.CENTER);
serverconfigPanel.add(buttonPanel_server,BorderLayout.SOUTH);
this.getContentPane().setLayout(new BorderLayout());
configure.add("客户端参数设置",clientconfigPanel);
if(ClientContext.getOperator().getPosition()==PmsDictionary.getValue("PMSOPERATOR", "POSITION", "系统管理员"));
configure.add("服务端参数设置",serverconfigPanel);
this.getContentPane().add(configure);
this.setSize(new Dimension(300,500));
this.setLocationRelativeTo(this.getParent());
this.setResizable(false);
this.setTitle("参数配置");
CommonUtil.setTitleIcon(this);
this.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnCancel_client||e.getSource()==btnCancel_server)
dispose();
else if(e.getSource()==btnOK_client){
btnOK_client_Performed();
}else if(e.getSource()==btnOK_server){
btnOK_server_Performed();
}

}
private void btnOK_client_Performed(){
Properties properties=new Properties();

for(int i=0;i<clientconfigTable.getRowCount();i++){
properties.setProperty((String)clientconfigTable.getValueAt(i, 0), (String)clientconfigTable.getValueAt(i, 1));
System.out.println(clientconfigTable.getValueAt(i, 0)+" : "+clientconfigTable.getValueAt(i, 1));
}
OutputStream osw =null;
try {
osw = new FileOutputStream("clientconfig.properties", true);

properties.save(osw, "");
} catch (IOException e) {
logger.error(e);
return;
}finally{

try {
if(osw!=null)
osw.close();
} catch (IOException e) {
logger.error(e);
}
}
JOptionPane.showMessageDialog(this, "客户端配置修改成功,下次启动将使用新的配置!", "提示", JOptionPane.INFORMATION_MESSAGE);
dispose();
}
private void btnOK_server_Performed(){

}

}
class ParameterModel extends DefaultTableModel{

String[] columns={"键","值"};
Properties properties=null;
Vector<Object> keys=new Vector<Object>();
public ParameterModel(Properties properties){
this.properties=properties;
Set keyset=properties.keySet();
for(Object key:keyset){
keys.add(key);
}
}
@Override
public int getRowCount() {
if(properties!=null)
return properties.size();
return 0;
}

@Override
public int getColumnCount() {
return 2;
}
public void setValueAt(Object aValue, int row, int column) {
fireTableCellUpdated(row, column);
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object key=keys.get(rowIndex);
switch(columnIndex){
case 0:
return key;
case 1:
return properties.get(key);
}
return "";
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
if(columnIndex==0)
return false;
return true;

}
}


这是我写的一个窗口,我是有一列需要修改,我的需求是这一列的若干行修改之后可以最后按一个‘确定’按钮统一保存,确定按下时才去从界面中获取
现在的问题是当我修改完这一列的一个单元格之后点击其他的地方,编辑状态消失了,但是界面上的值却恢复了原状,我希望它保持我修改后的值,请问要怎么修改呢, 跟踪代码的时候发现clientconfigtable的鼠标监听事件进不去,就是if(clientconfigTable.isEditing()){}进不去,哪位大侠比较熟悉这jtable编辑这一块帮帮忙呀
...全文
128 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2013-04-01
  • 打赏
  • 举报
回复
public void setValueAt(Object aValue, int row, int column) {
            fireTableCellUpdated(row, column);
        }
还没有把这个aValue存储到properties里,即没有存储到table的model里,所以会出现你说的现象
  • 打赏
  • 举报
回复
打印下,看properties里面是否有值。
「已注销」 2013-03-31
  • 打赏
  • 举报
回复
一句注释没有

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧