swing中的focus问题 1、在JFrame、JDialog中如何设置指定组件在初始获得焦点。2、如何让JTable的指定cell获得焦点。即使当前table失去焦点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、由于系统默认的焦点循环策略,是从上到下,从左到右第一个能获取焦点的组件默认获取焦点。 如果是设置默认按钮的话,使用getRootPane().setDefaultButton(defaultButton); 其他的组件可以使用设置焦点循环策略来实现默认获取焦点组件的任意指定。 setFocusTraversalPolicy(new DefaultFocusTraversalPolicy(){ @Override public Component getDefaultComponent(Container container) { return compo;//这里根据你的需要,进行处理 } }); getFocusTraversalPolicy().getDefaultComponent(compo).requestFocus();2、说的不是很明白,是选中,还是设置可编辑? 还是说设置可编辑,并向里面设置光标? 感谢 回答 第二个问题是这样的 在cell中修改 并进行检查 如果不符合条件 那么返回当前编辑的cell。由于重写了editstoped.在其中设置的检查逻辑。这样使用 cellEditAt会出现一些问题 比如 点中其他cell(当前table或者其他组件)触发editstoped。当鼠标点当前table那么要指定的cell的确获得了焦点但是点击的cell有获得焦点的外框。而鼠标点其他组件就达不到目的了。 补充第一个问题:JFrame中默认的好像ContainerFocusTraversalPolicy,我的意思是让你重载一下焦点循环策略中的getDefaultComponent方法。场景和我想得差不多,这样把你的代码给我看一下吧。以前也做过表格输入校验,如果不合法,直接选中之前的单元格并设置为编辑状态 public class TableCCellEditor extends DefaultCellEditor { private JTextField textCell = null; private List djList = null; private int row = 0; private int column = 0; private JGGS1208091Frame frame = null; private int iRow = 0; private JTable table = null; /** * コンストラクタ * * @param textField 編集のテキストボックス * @param list DJリスト * @param frame 親フレッム * @param iRow データのRow数 */ public TableCCellEditor(JTextField textField, List list, JGGS1208091Frame frame, int iRow) { super(textField); this.textCell = textField; this.djList = list; this.frame = frame; this.iRow = iRow; this.setClickCountToStart(0); } /* * @see javax.swing.DefaultCellEditor#getTableCellEditorComponent(javax.swing.JTable, java.lang.Object, boolean, int, int) */ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { this.row = row; this.column = column; this.table = table; delegate.setValue(value); return textCell; } /* * @see javax.swing.DefaultCellEditor#stopCellEditing() */ public boolean stopCellEditing() { int iValue = 0; DjPojo pojo = (DjPojo) djList.get(column); try { iValue = Integer.parseInt(textCell.getText()); } catch (Exception e) { getMessage(JGGS1208091Constants.MSG_INPUT_ERROR); this.fireEditingCanceled(); table.requestFocus();//这里处理焦点问题 包括下面2句 table.changeSelection(row, column, false, false);// table.editCellAt(row, column);// return false; } if (row == 2 && iValue != pojo.getFixMoQty()) { // 入力値の上限チェックを行なう。 if (iValue > pojo.getMaxMoQty().intValue()) { getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR); this.fireEditingCanceled(); table.requestFocus(); table.changeSelection(row, column, false, false); table.editCellAt(row, column); return false; } else { // 保存されるまで当項目を青で表示する。 pojo.changeEditFlg(true); pojo.changeC04EditFlg(true); pojo.setFixMoQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。 frame.setBlnNotSaved(true); frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。 frame.disableButtonReflect(); } } else if (row == 4 && iValue != pojo.getFixRpMoQty()) { // 入力値の上限チェックを行なう。 if (iValue > pojo.getMaxRpMoQty().intValue()) { getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR); this.fireEditingCanceled(); table.requestFocus(); table.changeSelection(row, column, false, false); table.editCellAt(row, column); return false; } else { // 保存されるまで当項目を青で表示する。 pojo.changeEditFlg(true); pojo.changeC06EditFlg(true); pojo.setFixRpMoQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。 frame.setBlnNotSaved(true); frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。 frame.disableButtonReflect(); } } else if (row == 6 && iValue != pojo.getFixSMoQty()) { // 入力値の上限チェックを行なう。 if (iValue + pojo.getFixSRpQty() > pojo.getStrategicQty() .intValue()) { getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR); this.fireEditingCanceled(); table.requestFocus(); table.changeSelection(row, column, false, false); table.editCellAt(row, column); return false; } else { // 保存されるまで当項目を青で表示する。 pojo.changeEditFlg(true); pojo.changeC08EditFlg(true); pojo.setFixSMoQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。 frame.setBlnNotSaved(true); frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。 frame.disableButtonReflect(); } } else if (row == 7 && iValue != pojo.getFixSRpQty()) { // 入力値の上限チェックを行なう。 if (iValue + pojo.getFixSMoQty() > pojo.getStrategicQty() .intValue()) { getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR); this.fireEditingCanceled(); table.requestFocus(); table.changeSelection(row, column, false, false); table.editCellAt(row, column); return false; } else { // 保存されるまで当項目を青で表示する。 pojo.changeEditFlg(true); pojo.changeC09EditFlg(true); pojo.setFixSRpQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。 frame.setBlnNotSaved(true); frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。 frame.disableButtonReflect(); } } this.fireEditingStopped(); return true; } /** * メッセージを取得 * * @param key メッセージのキー */ private void getMessage(String key) { String strMessage = ""; strMessage = frame.getParent().getMainFrameControler().getMessage(key); JOptionPane.showMessageDialog(table, strMessage, "エラー", JOptionPane.ERROR_MESSAGE); }}同事写的代码 我给他修改 业务逻辑与焦点问题不相干 getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR); this.fireEditingCanceled(); table.requestFocus(); table.changeSelection(row, column, false, false); table.editCellAt(row, column);这里的逻辑位置不对,猜想不错的话,表格的焦点获取不到,并且在editCellAt的Cell没有光标。家里有类似的处理代码,晚上给你传上来 问题就是一个事件触发的序列问题,在点击JTabel的时候,已经将Selection事件添加到AWT-EQ中,虽然在本次事件中设置了Table的选中和焦点,但是下一个事件已经将选中改变。我当时的做法是将将选中和获取焦点放在了CellEditor组件的FocusLost处理中,希望能给你点帮助: textCell.addFocusListener(new FocusAdapter(){public void focusLost(FocusEvent e) {table.getSelectionModel().setSelectionInterval(row, row);textCell.requestFocus();}}); 求助基于淘宝api的开发 求助:无法从静态上下文中引用非静态方法!在线等! 关于网站安全性问题,前辈请进 关于java获取操作系统路径的问题 java把电脑变成了垃圾仓库 基础问题:如何产生一个16进制随机数序列,然后返回成String数据类型? Help!第一次遇到这个问题!jvm.dll 请教画曲线的问题帮忙看看这样行不行 关于JAVA制作EXE一问(不要说我在污辱跨平台,但没办法有时就是要人家方便不要多平台,毕竟现在主流还是windwos) synchronized关键字问题?各位高手,帮帮忙! JVM的内存大小如何设置 jdbc连接问题
其他的组件可以使用设置焦点循环策略来实现默认获取焦点组件的任意指定。
setFocusTraversalPolicy(new DefaultFocusTraversalPolicy(){
@Override
public Component getDefaultComponent(Container container) {
return compo;//这里根据你的需要,进行处理
}
});
getFocusTraversalPolicy().getDefaultComponent(compo).requestFocus();2、说的不是很明白,是选中,还是设置可编辑? 还是说设置可编辑,并向里面设置光标?
使用 cellEditAt会出现一些问题 比如 点中其他cell(当前table或者其他组件)触发editstoped。当鼠标点当前table那么要指定的cell的确获得了焦点但是点击的cell有获得焦点的外框。而鼠标点其他组件就达不到目的了。
private List djList = null;
private int row = 0;
private int column = 0;
private JGGS1208091Frame frame = null;
private int iRow = 0;
private JTable table = null;
/**
* コンストラクタ
*
* @param textField 編集のテキストボックス
* @param list DJリスト
* @param frame 親フレッム
* @param iRow データのRow数
*/
public TableCCellEditor(JTextField textField, List list,
JGGS1208091Frame frame, int iRow) {
super(textField);
this.textCell = textField;
this.djList = list;
this.frame = frame;
this.iRow = iRow;
this.setClickCountToStart(0); } /*
* @see javax.swing.DefaultCellEditor#getTableCellEditorComponent(javax.swing.JTable, java.lang.Object, boolean, int, int)
*/
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) { this.row = row;
this.column = column;
this.table = table;
delegate.setValue(value); return textCell;
} /*
* @see javax.swing.DefaultCellEditor#stopCellEditing()
*/
public boolean stopCellEditing() {
int iValue = 0;
DjPojo pojo = (DjPojo) djList.get(column);
try {
iValue = Integer.parseInt(textCell.getText());
} catch (Exception e) {
getMessage(JGGS1208091Constants.MSG_INPUT_ERROR);
this.fireEditingCanceled();
table.requestFocus();//这里处理焦点问题 包括下面2句
table.changeSelection(row, column, false, false);//
table.editCellAt(row, column);//
return false;
}
if (row == 2 && iValue != pojo.getFixMoQty()) {
// 入力値の上限チェックを行なう。
if (iValue > pojo.getMaxMoQty().intValue()) {
getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR);
this.fireEditingCanceled();
table.requestFocus();
table.changeSelection(row, column, false, false);
table.editCellAt(row, column);
return false;
} else {
// 保存されるまで当項目を青で表示する。
pojo.changeEditFlg(true);
pojo.changeC04EditFlg(true);
pojo.setFixMoQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。
frame.setBlnNotSaved(true);
frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。
frame.disableButtonReflect(); }
} else if (row == 4 && iValue != pojo.getFixRpMoQty()) {
// 入力値の上限チェックを行なう。
if (iValue > pojo.getMaxRpMoQty().intValue()) {
getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR);
this.fireEditingCanceled();
table.requestFocus();
table.changeSelection(row, column, false, false);
table.editCellAt(row, column);
return false;
} else {
// 保存されるまで当項目を青で表示する。
pojo.changeEditFlg(true);
pojo.changeC06EditFlg(true);
pojo.setFixRpMoQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。
frame.setBlnNotSaved(true);
frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。
frame.disableButtonReflect(); }
} else if (row == 6 && iValue != pojo.getFixSMoQty()) {
// 入力値の上限チェックを行なう。
if (iValue + pojo.getFixSRpQty() > pojo.getStrategicQty()
.intValue()) {
getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR);
this.fireEditingCanceled();
table.requestFocus();
table.changeSelection(row, column, false, false);
table.editCellAt(row, column);
return false;
} else {
// 保存されるまで当項目を青で表示する。
pojo.changeEditFlg(true);
pojo.changeC08EditFlg(true);
pojo.setFixSMoQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。
frame.setBlnNotSaved(true);
frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。
frame.disableButtonReflect(); }
} else if (row == 7 && iValue != pojo.getFixSRpQty()) {
// 入力値の上限チェックを行なう。
if (iValue + pojo.getFixSMoQty() > pojo.getStrategicQty()
.intValue()) {
getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR);
this.fireEditingCanceled();
table.requestFocus();
table.changeSelection(row, column, false, false);
table.editCellAt(row, column);
return false;
} else {
// 保存されるまで当項目を青で表示する。
pojo.changeEditFlg(true);
pojo.changeC09EditFlg(true);
pojo.setFixSRpQty((double) iValue); // 計画日が一致する[B04][B05][B07][B09][C11]の再算出を行ない、値を表示する。
frame.setBlnNotSaved(true);
frame.recalculate(iRow, column); // [E02]反映ボタンをDisableにする。
frame.disableButtonReflect(); }
}
this.fireEditingStopped();
return true;
} /**
* メッセージを取得
*
* @param key メッセージのキー
*/
private void getMessage(String key) {
String strMessage = "";
strMessage = frame.getParent().getMainFrameControler().getMessage(key);
JOptionPane.showMessageDialog(table,
strMessage, "エラー", JOptionPane.ERROR_MESSAGE);
}}同事写的代码 我给他修改 业务逻辑与焦点问题不相干
this.fireEditingCanceled();
table.requestFocus();
table.changeSelection(row, column, false, false);
table.editCellAt(row, column);这里的逻辑位置不对,猜想不错的话,表格的焦点获取不到,并且在editCellAt的Cell没有光标。家里有类似的处理代码,晚上给你传上来
public void focusLost(FocusEvent e) {
table.getSelectionModel().setSelectionInterval(row, row);
textCell.requestFocus();
}
});