1、在JFrame、JDialog中如何设置指定组件在初始获得焦点。
2、如何让JTable的指定cell获得焦点。即使当前table失去焦点。

解决方案 »

  1.   

    1、由于系统默认的焦点循环策略,是从上到下,从左到右第一个能获取焦点的组件默认获取焦点。   如果是设置默认按钮的话,使用getRootPane().setDefaultButton(defaultButton);
       其他的组件可以使用设置焦点循环策略来实现默认获取焦点组件的任意指定。
        setFocusTraversalPolicy(new DefaultFocusTraversalPolicy(){
    @Override
    public Component getDefaultComponent(Container container) {
    return compo;//这里根据你的需要,进行处理
    }
    });
    getFocusTraversalPolicy().getDefaultComponent(compo).requestFocus();2、说的不是很明白,是选中,还是设置可编辑?  还是说设置可编辑,并向里面设置光标?
      

  2.   

    感谢 回答 第二个问题是这样的 在cell中修改 并进行检查 如果不符合条件 那么返回当前编辑的cell。由于重写了editstoped.在其中设置的检查逻辑。这样
    使用 cellEditAt会出现一些问题 比如 点中其他cell(当前table或者其他组件)触发editstoped。当鼠标点当前table那么要指定的cell的确获得了焦点但是点击的cell有获得焦点的外框。而鼠标点其他组件就达不到目的了。
      

  3.   

    补充第一个问题:JFrame中默认的好像ContainerFocusTraversalPolicy,我的意思是让你重载一下焦点循环策略中的getDefaultComponent方法。场景和我想得差不多,这样把你的代码给我看一下吧。以前也做过表格输入校验,如果不合法,直接选中之前的单元格并设置为编辑状态
      

  4.   

    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);
    }}同事写的代码 我给他修改 业务逻辑与焦点问题不相干
      

  5.   

                    getMessage(JGGS1208091Constants.MSG_INPUT_BEYOND_ERROR);
                    this.fireEditingCanceled();
                    table.requestFocus();
                    table.changeSelection(row, column, false, false);
                    table.editCellAt(row, column);
    这里的逻辑位置不对,猜想不错的话,表格的焦点获取不到,并且在editCellAt的Cell没有光标。家里有类似的处理代码,晚上给你传上来
      

  6.   

    问题就是一个事件触发的序列问题,在点击JTabel的时候,已经将Selection事件添加到AWT-EQ中,虽然在本次事件中设置了Table的选中和焦点,但是下一个事件已经将选中改变。我当时的做法是将将选中和获取焦点放在了CellEditor组件的FocusLost处理中,希望能给你点帮助: textCell.addFocusListener(new FocusAdapter(){
    public void focusLost(FocusEvent e) {
    table.getSelectionModel().setSelectionInterval(row, row);
    textCell.requestFocus();
    }
    });