JTable焦点问题

simaping 2007-10-14 12:02:44
jTable1.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent e) {
int hang=jTable1.getSelectedRow() ;

txtCode.setText(jTable1.getValueAt(hang,0).toString());

txtDetails.setText(jTable1.getValueAt(hang,1).toString());
}};
选中一行在TextFiled中显示内容
可是这样的话第一次选中时能正确显示,但一个表中切换行时,TextFiled中的内容不跟着更新,还是原来的。
怎么办?
...全文
252 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2007-10-14
  • 打赏
  • 举报
回复
我还以为要把table的值刷新后触发事件了
不要用addFocusListener,Focus事件只发生一次,除非你的Focus离开了jtable,日然后再重新选择jtable时才会触发,一旦聚焦在jtable以后就不会在触发focus事件了。所以可以改用addListSelectionListener

your_table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
int hang=jTable1.getSelectedRow() ;
if (hang > -1) {
txtCode.setText(jTable1.getValueAt(hang,0).toString());
txtDetails.setText(jTable1.getValueAt(hang,1).toString());
}
}
});

如果是刷新表以后触发事件,可以用addTableModelListener
your_table.getTableModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
int hang=jTable1.getSelectedRow() ;
if (hang > -1) {
txtCode.setText(jTable1.getValueAt(hang,0).toString());
txtDetails.setText(jTable1.getValueAt(hang,1).toString());
}
}
});


simaping 2007-10-14
  • 打赏
  • 举报
回复
不行,还是在表内连续切换行时,文本框内容不变。
qybao 2007-10-14
  • 打赏
  • 举报
回复
把一下代码下到一个函数
void setSelectedValue() {
int hang=jTable1.getSelectedRow() ;
if (hang > -1) {
txtCode.setText(jTable1.getValueAt(hang,0).toString());
txtDetails.setText(jTable1.getValueAt(hang,1).toString());
}
}

修改这里
jTable1.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent e) {
setSelectedValue();
}};

修改你表中切换行时的代码,在表切换完后调用setSelectedValue()
simaping 2007-10-14
  • 打赏
  • 举报
回复
现在的问题是某一行获取焦点,再点击表中的其他行时,获取不到新的焦点,文本框显示的还是原来行的内容。只有点击表以外的组件时原来的焦点才失去。
simaping 2007-10-14
  • 打赏
  • 举报
回复
谢谢。不过我试了还是不行啊。
yuyu622 2007-10-14
  • 打赏
  • 举报
回复
哦,说漏了点,如果用Table键的话不会出现两次,只有用鼠标点的时候才会出现两次.
yuyu622 2007-10-14
  • 打赏
  • 举报
回复
实现了,不过会调用两次, 不过只设置TextFiled的内容倒还不影响,或你自己再想想办法

package untitled1;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;

/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
class DemoTable extends JTable{
public DemoTable(Object[][] a,Object [] b){
super(a,b);
}
public void valueChanged(ListSelectionEvent e)
{
System.out.println("OK");
}
}
//主要就是这里,自己重写的JTable类


public class Frame1 extends JFrame {
JPanel contentPane;
JPanel jPanel1 = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
JScrollPane jScrollPane1 = new JScrollPane();
Object[] data ={"one", "two", "three", "four"};
Object[][] d={{"five", "six", "seven", "eight"},
{"nine", "ten", "eleven", "twelve"},
};

DemoTable jTable1=new DemoTable(d,data);
public Frame1() {
try {
setDefaultCloseOperation(EXIT_ON_CLOSE);
jbInit();
} catch (Exception exception) {
exception.printStackTrace();
}
}

/**
* Component initialization.
*
* @throws java.lang.Exception
*/
private void jbInit() throws Exception {
contentPane = (JPanel) getContentPane();
contentPane.setLayout(null);
setSize(new Dimension(452, 369));
setTitle("Frame Title");
jPanel1.setBorder(BorderFactory.createEtchedBorder());
jPanel1.setBounds(new Rectangle(11, 5, 366, 262));
jPanel1.setLayout(borderLayout1);
contentPane.add(jPanel1);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jScrollPane1.getViewport().add(jTable1);
}
}

62,614

社区成员

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

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