双击JTable中的数据项如何关闭包含该JTable的JDialog?急....先谢谢拉 在JDialog中加入一个JTable,jTable中是我查询数据库得到的数据,我的问题是1.通过在JTable数据项上双击鼠标关闭JDialog,JDialog包含该JTable2.将鼠标双击的数据项回填到textfield中 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不难啊.对JTable加入鼠标监听.双击后关闭用关闭对话框的方法关闭就行了.至于取数据,也是在鼠标监控方法里,双击后能得到行和列的值,那么就能到数据项的值了.然后把得到的数据传数需要得到该数据的类的方法. http://my.nbip.net/homepage/zhouB403/MyCode/TableEditDemo.zip 谢谢两位,我基本上已经实现了获得数据和向textfield中回填数据,我先在面临的问题是我双击鼠标后Dialog不能被关闭。我现在代码帖出请各位看是哪里出现问题了,请各位指教:这是我的JTable类:public class ShouFeiXiangMuTable extends JPanel { //声明表格 JTable table = new JTable(); //声明表格的数据类 DefaultTableModel model; //表格的数据 Object[][] data={ { "", "", "", "", "", "" } }; //表格的标题 String[] columnNames = { "代 码", "拼 音 码", "自定义码", "收 费 项 目", "单 位", "单 价" }; JScrollPane jScrollPane1 = new JScrollPane(); BorderLayout borderLayout1 = new BorderLayout(); public ShouFeiXiangMuTable() { try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } void jbInit() throws Exception { Dimension s = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); this.setBackground(SystemColor.controlHighlight); this.setFont(new java.awt.Font("Dialog", 0, 12)); this.setDebugGraphicsOptions(0); this.setPreferredSize(new Dimension(680, 400)); this.setToolTipText(""); RunClass runClass = new RunClass(); List list = (List) runClass.getLeechdomInfo(); if (list == null || list.size() < 1) { JLabel label = new JLabel("表中无数据,请到系统管理添加数据!",SwingConstants.CENTER); label.setFont(new Font("Dialog", 0, 12)); JOptionPane.showMessageDialog(null, label); } else { int trow=list.size(); int tcol=columnNames.length; data = new Object[trow][tcol]; int tmp=0; for (int i = 0; i < list.size(); i++) { for (int row = 0; row < trow; row++) { ShouFeiXiangMuDo shoufeixiangmu = new ShouFeiXiangMuDo(); shoufeixiangmu = (ShouFeiXiangMuDo) list.get(i); String[] values = { shoufeixiangmu.getDM(), //从数据库中得到的数据 shoufeixiangmu.getPYM(), //从数据库中得到的数据 shoufeixiangmu.getZDYM(), //从数据库中得到的数据 shoufeixiangmu.getSFXM(), //从数据库中得到的数据 shoufeixiangmu.getDW(), //从数据库中得到的数据 String.valueOf(shoufeixiangmu.getJG()) //从数据库中得到的数据 }; for (int j = 0; j < values.length; j++) { data[tmp][j] = values[j]; } } tmp++; } } model =new DefaultTableModel(data, columnNames) { public boolean isCellEditable(int row, int column) { return false; } //指让单元不可编辑 }; table.setModel(model); //指定标题的重新排序不被允许 table.getTableHeader().setReorderingAllowed(false); //不会因为在列标题之间拖动而改变大小// table.getTableHeader().setResizingAllowed(false); this.setLayout(borderLayout1); //使选择框成为一个单元格 table.getTableHeader().setFont(new java.awt.Font("Dialog", 0, 14)); table.getColumnModel().getColumn(3).setPreferredWidth( 300 ); table.getColumnModel().getColumn(4).setPreferredWidth( 50 ); table.setFont(new java.awt.Font("Dialog", 0, 12)); table.setDebugGraphicsOptions(0); table.setMaximumSize(new Dimension(2147483647, 100)); table.setColumnSelectionAllowed(false); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setRowHeight(20); //取得表格的行方法 ListSelectionModel rowSM = table.getSelectionModel(); //加入行选择接收器 rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //当多种事件被激发的时候,不执行行接收器后面的代码 if (e.getValueIsAdjusting()) return; //取得行对象 ListSelectionModel lsm = (ListSelectionModel) e.getSource(); int selectedRow = lsm.getMinSelectionIndex(); //取得行的第一列数据// model = table.getModel(); Object data = model.getValueAt(selectedRow, 3); System.out.println("第一列数据值=======" + data); } }); //JTable中怎样获取鼠标所在位置的行数 table.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { //双击了鼠标显示详细信息 if (e.getClickCount() == 2) { //获取鼠标点击的行的位置(及行数) Point mousepoint; mousepoint = e.getPoint(); //取得行的第一列数据 Object data = model.getValueAt(table.rowAtPoint(mousepoint), 0); String value = data.toString(); List v_list = (List)new RunClass().getLeechdomInfo(); if (v_list == null || v_list.size() < 1) { } else { ShouFeiXiangMuDo yp = (ShouFeiXiangMuDo) v_list.get(0); MenZhenHuaJiaShouFei.createInstance().jTextField3.setText(yp.getSFXM()); MyTableDialog.closeMyDialog(); } } } }); jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); jScrollPane1.getViewport().setBackground(Color.white); jScrollPane1.setFont(new java.awt.Font("Dialog", 0, 12)); jScrollPane1.setDebugGraphicsOptions(0); jScrollPane1.setSize(s); this.add(jScrollPane1, BorderLayout.CENTER); jScrollPane1.getViewport().add(table); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); }}这是我的Dialog类:public class MyTableDialog extends JDialog { private static MyTableDialog myTableDialog = new MyTableDialog(true); ShouFeiXiangMuTable jTable = new ShouFeiXiangMuTable(); DefaultListModel Model = new DefaultListModel(); JPanel panel1 = new JPanel(); BorderLayout borderLayout1 = new BorderLayout(); JScrollPane jScrollPane1 = new JScrollPane(); public MyTableDialog(boolean bool) { this(null, "收费项目选择", bool); } public MyTableDialog(Frame frame, String title, boolean modal) { super(frame, title, modal); this.setBounds(200,220,680,400); try { jbInit(); } catch(Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { getContentPane().add(getJPanel()); } public JPanel getJPanel(){ panel1.add(jTable,BorderLayout.CENTER); return panel1; } public static void closeMyDialog(){ myTableDialog.dispose(); }} 我想问题应该出现在MyTableDialog这个类,我刚开始很奇怪为什么有如下这句话哪?private static MyTableDialog myTableDialog = new MyTableDialog(true);后来我看到你想有个句柄来找到MyTableDialog的实例。但是,我想知道你是如何使用MyTableDialog类的哪?是每一次都new出来一个,然后让它显示吗?如果这样,你是用的是一个实例,而上面的那就又是另一个实例了,而你dispose的是上面的那个实例,就不会影响到你现在使用的实例了 Michael_lee(水晶先生) 你说的就是我想用的,我据个例子,我说一下流程:我是由一个JDialog里的一个JTextField点击回车键,弹出一个JDialog1,在JDialog1中有一个JTable然后双击JTable中的一项然后关闭JDialog1,在将选择的一项帖回JDialog的JTextField中,有点罗嗦,不知道说清楚了没有。我在解释一下private static MyTableDialog myTableDialog = new MyTableDialog(true);我是想用在JTable中使用MyTableDialog的实例来关闭Dialog。这是可行的,(我有写了一个在JDialog中展现一个JList实现前面的流程),现在我想是不是出错是在一个内部类中调用该实例的一个dispose()一个方法出错了。public static void closeMyDialog(){ myTableDialog.dispose(); }也就是该方法不起作用的原因呀?这只是我的猜想,请指教 第一:private static MyTableDialog myTableDialog = new MyTableDialog(true);改成private static MyTableDialog myTableDialog = null;第二:public MyTableDialog(Frame frame, String title, boolean modal) 改成 public MyTableDialog(Frame frame, String title, boolean modal) { super(frame, title, modal); myTableDialog = this; this.setBounds(200, 220, 680, 400); try { jbInit(); } catch(Exception ex) { ex.printStackTrace(); } }第三:public static void closeMyDialog()改成: public static void closeMyDialog() { myTableDialog.dispose(); myTableDialog = null; }再试试,我想你会得到想要的效果 非常感谢恢复帖子的朋友,现在问题已经解决了,特别感谢 Michael_lee(水晶先生) 。 纠结了3,4天的一个问题,尝试过很多方法都没解决。求助!急急急!!! 几个小问题,挺有意思的,请来看看。 高手来看看这是怎么回事,关于构造器 如何查找出在字符串"7@11@12@13@"中的但不在字符串"8@13@15@16@"中的数字7,11和12啊。。。 请问 这段代码是什么意思? 有没有错误!!! Jar包在Windows下与在Linux下不一样? 关于JDBC驱动问题 如何取得一个目录下所有.txt文件的列表? 字符串替换问题 JBuilder 4 的菜鸟问题 用笔记本的兄弟进来看看 "hello world"之后应该干什么?——大家都来谈谈自己心得~~
至于取数据,也是在鼠标监控方法里,双击后能得到行和列的值,那么就能到数据项的值了.然后把得到的数据传数需要得到该数据的类的方法.
这是我的JTable类:
public class ShouFeiXiangMuTable extends JPanel {
//声明表格
JTable table = new JTable();
//声明表格的数据类
DefaultTableModel model;
//表格的数据
Object[][] data={
{
"", "", "", "", "", ""
}
};
//表格的标题
String[] columnNames = {
"代 码", "拼 音 码", "自定义码", "收 费 项 目", "单 位", "单 价"
};
JScrollPane jScrollPane1 = new JScrollPane();
BorderLayout borderLayout1 = new BorderLayout();
public ShouFeiXiangMuTable() {
try {
jbInit();
}
catch (Exception ex) {
ex.printStackTrace();
}
} void jbInit() throws Exception {
Dimension s = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
this.setBackground(SystemColor.controlHighlight);
this.setFont(new java.awt.Font("Dialog", 0, 12));
this.setDebugGraphicsOptions(0);
this.setPreferredSize(new Dimension(680, 400));
this.setToolTipText(""); RunClass runClass = new RunClass();
List list = (List) runClass.getLeechdomInfo();
if (list == null || list.size() < 1) {
JLabel label = new JLabel("表中无数据,请到系统管理添加数据!",SwingConstants.CENTER);
label.setFont(new Font("Dialog", 0, 12));
JOptionPane.showMessageDialog(null, label);
}
else {
int trow=list.size();
int tcol=columnNames.length;
data = new Object[trow][tcol];
int tmp=0;
for (int i = 0; i < list.size(); i++) {
for (int row = 0; row < trow; row++) {
ShouFeiXiangMuDo shoufeixiangmu = new ShouFeiXiangMuDo();
shoufeixiangmu = (ShouFeiXiangMuDo) list.get(i);
String[] values = {
shoufeixiangmu.getDM(), //从数据库中得到的数据
shoufeixiangmu.getPYM(), //从数据库中得到的数据
shoufeixiangmu.getZDYM(), //从数据库中得到的数据
shoufeixiangmu.getSFXM(), //从数据库中得到的数据
shoufeixiangmu.getDW(), //从数据库中得到的数据
String.valueOf(shoufeixiangmu.getJG()) //从数据库中得到的数据 };
for (int j = 0; j < values.length; j++) {
data[tmp][j] = values[j];
}
}
tmp++;
}
}
model =new DefaultTableModel(data, columnNames) {
public boolean isCellEditable(int row, int column) {
return false;
} //指让单元不可编辑
};
table.setModel(model);
//指定标题的重新排序不被允许
table.getTableHeader().setReorderingAllowed(false);
//不会因为在列标题之间拖动而改变大小
// table.getTableHeader().setResizingAllowed(false);
this.setLayout(borderLayout1);
//使选择框成为一个单元格
table.getTableHeader().setFont(new java.awt.Font("Dialog", 0, 14));
table.getColumnModel().getColumn(3).setPreferredWidth( 300 );
table.getColumnModel().getColumn(4).setPreferredWidth( 50 );
table.setFont(new java.awt.Font("Dialog", 0, 12));
table.setDebugGraphicsOptions(0);
table.setMaximumSize(new Dimension(2147483647, 100));
table.setColumnSelectionAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setRowHeight(20);
//取得表格的行方法
ListSelectionModel rowSM = table.getSelectionModel();
//加入行选择接收器
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//当多种事件被激发的时候,不执行行接收器后面的代码
if (e.getValueIsAdjusting())
return;
//取得行对象
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
int selectedRow = lsm.getMinSelectionIndex();
//取得行的第一列数据
// model = table.getModel();
Object data = model.getValueAt(selectedRow, 3);
System.out.println("第一列数据值=======" + data);
}
});
//JTable中怎样获取鼠标所在位置的行数
table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
//双击了鼠标显示详细信息
if (e.getClickCount() == 2) {
//获取鼠标点击的行的位置(及行数)
Point mousepoint;
mousepoint = e.getPoint();
//取得行的第一列数据
Object data = model.getValueAt(table.rowAtPoint(mousepoint), 0);
String value = data.toString();
List v_list = (List)new RunClass().getLeechdomInfo();
if (v_list == null || v_list.size() < 1) {
}
else {
ShouFeiXiangMuDo yp = (ShouFeiXiangMuDo) v_list.get(0);
MenZhenHuaJiaShouFei.createInstance().jTextField3.setText(yp.getSFXM());
MyTableDialog.closeMyDialog();
}
}
}
}); jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jScrollPane1.getViewport().setBackground(Color.white);
jScrollPane1.setFont(new java.awt.Font("Dialog", 0, 12));
jScrollPane1.setDebugGraphicsOptions(0);
jScrollPane1.setSize(s);
this.add(jScrollPane1, BorderLayout.CENTER);
jScrollPane1.getViewport().add(table);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
}
这是我的Dialog类:
public class MyTableDialog extends JDialog {
private static MyTableDialog myTableDialog = new MyTableDialog(true);
ShouFeiXiangMuTable jTable = new ShouFeiXiangMuTable();
DefaultListModel Model = new DefaultListModel();
JPanel panel1 = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
JScrollPane jScrollPane1 = new JScrollPane();
public MyTableDialog(boolean bool) {
this(null, "收费项目选择", bool);
}
public MyTableDialog(Frame frame, String title, boolean modal) {
super(frame, title, modal);
this.setBounds(200,220,680,400);
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
private void jbInit() throws Exception {
getContentPane().add(getJPanel());
}
public JPanel getJPanel(){
panel1.add(jTable,BorderLayout.CENTER);
return panel1;
}
public static void closeMyDialog(){
myTableDialog.dispose();
}
}
我是想用在JTable中使用MyTableDialog的实例来关闭Dialog。这是可行的,(我有写了一个在JDialog中展现一个JList实现前面的流程),现在我想是不是出错是在一个内部类中调用该实例的一个dispose()一个方法出错了。
public static void closeMyDialog(){
myTableDialog.dispose();
}
也就是该方法不起作用的原因呀?这只是我的猜想,请指教
{
super(frame, title, modal);
myTableDialog = this;
this.setBounds(200, 220, 680, 400);
try
{
jbInit();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
第三:public static void closeMyDialog()改成: public static void closeMyDialog()
{
myTableDialog.dispose();
myTableDialog = null;
}
再试试,我想你会得到想要的效果