请教JTable增加行后,如何让光标停在所增行的第一单元格问题 setRowSelectionInterval(int index0, int index1) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if((col+1)==cct && keycode==KeyEvent.VK_ENTER){ model.addRow(new Vector()); jt.setColumnSelectionInterval(0,0); //add this line, select the first col} if((col+1)==cct && keycode==KeyEvent.VK_ENTER){ rowcount=model.getRowCount(); model.addRow(new Vector()); jt.changeSelection(selected-1,0,true,true); } 一点点错误,因为你的selected变量没赋值,应用 if((col+1)==cct && keycode==KeyEvent.VK_ENTER){ selected=jt.getSelectedRow(); model.addRow(new Vector()); jt.changeSelection(selected,0,true,true); }如果想放到最后一行的话就用 if((col+1)==cct && keycode==KeyEvent.VK_ENTER){ rowcount=model.getRowCount(); model.addRow(new Vector()); jt.changeSelection(rowcount-1,0,true,true); } 你没试么就是最后单元格上按下回车键后,会增加一行并让焦点停在所增加行的第一个单元格中啊import javax.swing.*;import java.util.*;import javax.swing.table.*;import java.applet.*;import java.awt.*;import java.awt.event.*;import javax.swing.event.*;import java.lang.String;public class no2 extends JApplet{ static int v = JSplitPane.VERTICAL_SPLIT; Vector srcdata = new Vector(); String[] columnName = {"×Ö¶Î","×Ö¶Î","×Ö¶Î","×Ö¶Î"}; Vector rowdata = new Vector(); Vector cname = new Vector(4); JTable jt = new JTable(); DefaultTableModel model = new DefaultTableModel(srcdata,cname); JScrollPane js = new JScrollPane(); //´´½¨¹ö¶¯´° public void init() { Container c = this.getContentPane(); JPanel jp1 = new JPanel(); //×°Ôز˵¥µÄÃæ°å jp1.setLayout(new FlowLayout(FlowLayout.LEFT)); JMenuBar jmb = new JMenuBar(); //´´½¨²Ëµ¥Ìõ JMenu buymenu = new JMenu("²Ëµ¥"); JMenuItem b1 = new JMenuItem("×ÓÏî"); buymenu.add(b1); //½«×ÓÏî¼ÓÈë²Ëµ¥ jmb.add(buymenu); //½«²Ëµ¥¼ÓÈë²Ëµ¥Ìõ jp1.add(jmb); //½«²Ëµ¥ÌõÈëÃæ°å JPanel jp2 = new JPanel(); //×°Ôرí¸ñµÄÃæ°å JSplitPane jsp = new JSplitPane(v,true,jp1,js); rowdata.add(""); rowdata.add(""); rowdata.add(""); rowdata.add(""); cname.add(columnName[0]); cname.add(columnName[1]); cname.add(columnName[2]); cname.add(columnName[3]); srcdata.add(rowdata); jt.setModel(model); jt.setCellSelectionEnabled(true); //ÊÇÄÜ·ñÑ¡ÖÐÒ»¸öcell£¬Ò²¾ÍÊÇÒ»ÐкÍÒ»ÁеĽ»²æµ¥Ôª¸ñ jt.setColumnSelectionAllowed(true); //ÊÇÄÜ·ñÑ¡ÖÐÒ»ÁÐ b1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent event) { if(event.getSource()instanceof JMenuItem) { js.add(jt); } js.getViewport().setView(jt); } }); jt.addKeyListener(new java.awt.event.KeyListener() { int col = 0; int selected; int rowcount; public void keyPressed(KeyEvent e) { JDialog jfr = new JDialog(); col = jt.getSelectedColumn(); int cct = jt.getColumnCount(); int keycode = e.getKeyCode(); showStatus("col:" + col + "selected:" + selected); if(keycode == KeyEvent.VK_ENTER && col == 0) { rowcount=model.getRowCount(); String calls = jt.getValueAt(selected,col).toString(); JLabel tmpj = new JLabel("¸Ã±í¸ñ¹²"+rowcount+"ÐУ¬" + cct + "ÁС£" + "ÄúÔÚµÚ" + (selected + 1) + "ÐеÚ" + (col + 1) + "µ¥Ôª¸ñ´¦ÊäÈëÁË×Ö·û£º" + calls,JLabel.CENTER); jfr.getContentPane().add(tmpj); jfr.setSize(600,400); jfr.show(); } if((col+1)==cct && keycode==KeyEvent.VK_ENTER){ selected=jt.getSelectedRow(); model.addRow(new Vector()); jt.changeSelection(selected,0,true,true); } //¶Ô´ò¿ªµÄ¶Ô»°¿ò½øÐмàÌý£¬µ±¹Ø±Õºó£¬ÔòÌøµ½µÚ¶þ¸ñ£¡ jfr.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { jt.setEditingColumn(col + 1); //ÉèÖñ»±à¼­µÄÁмÓ1 } }); } public void keyTyped(KeyEvent e) {} public void keyReleased(KeyEvent e) {} }); c.add(jsp); }} Hodex(小何才露尖尖角) :首先谢谢您对我的帮助,你的代码的确实现了焦点的确停在了所增加的行的第一单元格处,但在所增行的第一单元格输入字符后,再按下回车键就又跳回到第一行上去了应该能做到所增加的每一行都于第一行的操作结果相同,即:1.第一行中第一单元格输入字符按下回车后,会调用JDialog2.JDialog关闭后,焦点到该行的下一单元格3.当在首行最后单元格处按下回车键后,先增加行,然后其它功能与首行一样4.无论增加行,其行效果都与首行一样 用SetColumnSelectionInterval() 或者 changeSelection 都已实现你的要求:“让光标停在所增加行的第一个单元格中”。按下回车键就又跳回到第一行, 这是FocusTraverse的默认行为。"Enter"后,同列的下一行单元得到Focus, 到最后一行,下一次就是下一列的第一行。MS Excel 不是这样的吗?要实现你的焦点转移要求,则需要增加相应焦点转移的代码。例如下面的代码没有用处。*********** //对打开的对话框进行监听,当关闭后,则跳到第二格! jfr.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { jt.setEditingColumn(col + 1); //设置被编辑的列加1 } });******************** 一个程序中启动了多个线程后,怎么去控制这些线程? 小女子跪求!!! 一个简单的程序报错 50分Repaint方法调用的问题! 请教关于jsp调用oracle存储过程出现的问题!万分感谢! 求助JAVA连ORACLE问题 帮帮忙,如何在遗传字符串中读取txt中的小数 有点好玩的中文编程。问:如何将字符(如中文名)赋给姓名? 什么是SWT?和swing有什么区别? 请问如何在JBuilder中设计窗体才方便 java可以做能单独执行的exe吗(不要jvm)?? 98下 安装jdk如何 配置环境变量
model.addRow(new Vector());
jt.setColumnSelectionInterval(0,0); //add this line, select the first col
}
rowcount=model.getRowCount();
model.addRow(new Vector());
jt.changeSelection(selected-1,0,true,true);
}
因为你的selected变量没赋值,
应用
if((col+1)==cct && keycode==KeyEvent.VK_ENTER){
selected=jt.getSelectedRow();
model.addRow(new Vector());
jt.changeSelection(selected,0,true,true);
}如果想放到最后一行的话就用
if((col+1)==cct && keycode==KeyEvent.VK_ENTER){
rowcount=model.getRowCount();
model.addRow(new Vector());
jt.changeSelection(rowcount-1,0,true,true);
}
就是最后单元格上按下回车键后,会增加一行并让焦点停在所增加行的第一个单元格中啊import javax.swing.*;
import java.util.*;
import javax.swing.table.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.lang.String;public class no2 extends JApplet
{
static int v = JSplitPane.VERTICAL_SPLIT;
Vector srcdata = new Vector();
String[] columnName =
{"×Ö¶Î","×Ö¶Î","×Ö¶Î","×Ö¶Î"};
Vector rowdata = new Vector();
Vector cname = new Vector(4);
JTable jt = new JTable();
DefaultTableModel model = new DefaultTableModel(srcdata,cname);
JScrollPane js = new JScrollPane(); //´´½¨¹ö¶¯´° public void init()
{
Container c = this.getContentPane();
JPanel jp1 = new JPanel(); //×°Ôز˵¥µÄÃæ°å
jp1.setLayout(new FlowLayout(FlowLayout.LEFT));
JMenuBar jmb = new JMenuBar(); //´´½¨²Ëµ¥Ìõ
JMenu buymenu = new JMenu("²Ëµ¥");
JMenuItem b1 = new JMenuItem("×ÓÏî");
buymenu.add(b1); //½«×ÓÏî¼ÓÈë²Ëµ¥
jmb.add(buymenu); //½«²Ëµ¥¼ÓÈë²Ëµ¥Ìõ
jp1.add(jmb); //½«²Ëµ¥ÌõÈëÃæ°å
JPanel jp2 = new JPanel(); //×°Ôرí¸ñµÄÃæ°å
JSplitPane jsp = new JSplitPane(v,true,jp1,js);
rowdata.add("");
rowdata.add("");
rowdata.add("");
rowdata.add("");
cname.add(columnName[0]);
cname.add(columnName[1]);
cname.add(columnName[2]);
cname.add(columnName[3]);
srcdata.add(rowdata);
jt.setModel(model);
jt.setCellSelectionEnabled(true); //ÊÇÄÜ·ñÑ¡ÖÐÒ»¸öcell£¬Ò²¾ÍÊÇÒ»ÐкÍÒ»ÁеĽ»²æµ¥Ôª¸ñ
jt.setColumnSelectionAllowed(true); //ÊÇÄÜ·ñÑ¡ÖÐÒ»ÁÐ b1.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent event)
{
if(event.getSource()instanceof JMenuItem)
{
js.add(jt);
}
js.getViewport().setView(jt);
}
}); jt.addKeyListener(new java.awt.event.KeyListener()
{
int col = 0;
int selected;
int rowcount;
public void keyPressed(KeyEvent e)
{
JDialog jfr = new JDialog();
col = jt.getSelectedColumn();
int cct = jt.getColumnCount();
int keycode = e.getKeyCode();
showStatus("col:" + col + "selected:" + selected);
if(keycode == KeyEvent.VK_ENTER && col == 0)
{ rowcount=model.getRowCount();
String calls = jt.getValueAt(selected,col).toString();
JLabel tmpj = new JLabel("¸Ã±í¸ñ¹²"+rowcount+"ÐУ¬" + cct + "ÁС£" + "ÄúÔÚµÚ" + (selected + 1) + "ÐеÚ" + (col + 1) + "µ¥Ôª¸ñ´¦ÊäÈëÁË×Ö·û£º" + calls,JLabel.CENTER);
jfr.getContentPane().add(tmpj);
jfr.setSize(600,400);
jfr.show();
} if((col+1)==cct && keycode==KeyEvent.VK_ENTER){
selected=jt.getSelectedRow();
model.addRow(new Vector());
jt.changeSelection(selected,0,true,true);
} //¶Ô´ò¿ªµÄ¶Ô»°¿ò½øÐмàÌý£¬µ±¹Ø±Õºó£¬ÔòÌøµ½µÚ¶þ¸ñ£¡
jfr.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
jt.setEditingColumn(col + 1); //ÉèÖñ»±à¼­µÄÁмÓ1
}
});
}
public void keyTyped(KeyEvent e)
{}
public void keyReleased(KeyEvent e)
{}
});
c.add(jsp);
}
}
首先谢谢您对我的帮助,
你的代码的确实现了焦点的确停在了所增加的行的第一单元格处,但在所增行的第一单元格输入字符后,再按下回车键就又跳回到第一行上去了
应该能做到所增加的每一行都于第一行的操作结果相同,即:1.第一行中第一单元格输入字符按下回车后,会调用JDialog
2.JDialog关闭后,焦点到该行的下一单元格
3.当在首行最后单元格处按下回车键后,先增加行,然后其它功能与首行一样
4.无论增加行,其行效果都与首行一样
按下回车键就又跳回到第一行, 这是FocusTraverse的默认行为。"Enter"后,同列的下一行单元得到Focus, 到最后一行,下一次就是下一列的第一行。MS Excel 不是这样的吗?要实现你的焦点转移要求,则需要增加相应焦点转移的代码。例如下面的代码没有用处。
***********
//对打开的对话框进行监听,当关闭后,则跳到第二格!
jfr.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
jt.setEditingColumn(col + 1); //设置被编辑的列加1
}
});
********************