【问题标题】:Inserted Row Selection jTable插入的行选择 jTable
【发布时间】:2014-05-14 10:56:02
【问题描述】:

我有一个 JTable 插入一个空行,当我标记出倒数第二列时,这工作正常。我还添加了table.setRowSelectionInterval(lastRow,lastRow); 以同时选择我新插入的行,但它抛出了java.lang.NullPointerException

需要帮助才能选择最后插入的行。提前致谢。

public class JFrameTable extends javax.swing.JFrame {

protected JTable table;


public JFrameTable() {
    initComponents();

}

public  void setValueAt(int col){
     DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    if(col==2){
       Vector row = new Vector();
       row.add(null);
       row.add(null);
       row.add(null);
       row.add(null);

     model.addRow(row);
    }
}



private class MyKeyListener implements KeyListener {

    public MyKeyListener() {
    }

    @Override
    public void keyReleased(KeyEvent e) {

        if(e.getKeyCode()==e.VK_TAB){
            int column = jTable1.getSelectedColumn();
            int rowCount= jTable1.getRowCount();
            int currentRow=jTable1.getSelectedRow();
            if(currentRow==rowCount-1) {
                jTable1.editCellAt(currentRow, column);
                jTable1.transferFocus();
           }
           if(column==3 && currentRow==rowCount-1){
                setValueAt(2);
           }
           if(column==3){
              currentRow++;
              column=0;
              jTable1.editCellAt(currentRow, column);
              jTable1.transferFocus();
          try{                
              table.setRowSelectionInterval(rowCount-1,rowCount-1);
          }catch(Exception ek){
              System.out.println(ek);
          } 
          }
           System.out.println(rowCount);
          }

    }
     @Override
    public void keyTyped(KeyEvent e) {

    }
     @Override
    public void keyPressed(KeyEvent e) {

    }

}

private class MySelectionListener implements ListSelectionListener {

    public MySelectionListener() {
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {

    }
}


private class setTableModelListener implements TableModelListener{
    public void tableChanged(TableModelEvent e) {

}
}


@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTable1.setBackground(new java.awt.Color(75, 107, 221));
    jTable1.setFont(new java.awt.Font("SansSerif", 1, 15)); // NOI18N
    jTable1.setForeground(new java.awt.Color(254, 247, 247));
    jTable1.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {
            {null, null, null, null}
        },
        new String [] {
            "Name", "Roll", "Stream", "Sex"
        }
    ) {
        boolean[] canEdit = new boolean [] {
            true, true, true, false
        };

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    jTable1.getModel().addTableModelListener(new setTableModelListener());
    jTable1.getTableHeader().setReorderingAllowed(false);
    jTable1.setRowHeight(20);
    jTable1.getTableHeader().setBackground(Color.BLACK);
    jTable1.getTableHeader().setFont(new Font ("SansSerif", Font.BOLD ,15));
    jTable1.getTableHeader().setForeground(Color.WHITE);
    jTable1.getColumnModel().getSelectionModel().addListSelectionListener(new MySelectionListener());
    jTable1.addKeyListener(new MyKeyListener());
    jTable1.setRowSelectionAllowed(true);
    jScrollPane1.setViewportView(jTable1);
    jTable1.getColumnModel().getColumn(0).setResizable(false);
    jTable1.getColumnModel().getColumn(0).setPreferredWidth(150);
    jTable1.getColumnModel().getColumn(1).setResizable(false);
    jTable1.getColumnModel().getColumn(1).setPreferredWidth(50);
    jTable1.getColumnModel().getColumn(2).setResizable(false);
    jTable1.getColumnModel().getColumn(2).setPreferredWidth(30);
    jTable1.getColumnModel().getColumn(3).setResizable(false);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 630, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 95, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(JFrameTable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JFrameTable().setVisible(true);

        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration                   
  }

【问题讨论】:

  • 你能给我们看看代码吗?
  • 不是完整的代码,而是那些给你带来问题的部分
  • 我已经发布了完整的代码
  • @Pappu 1. :-) 必须返回到您的1st question,2. 不要将KeyListener 用于JTable,这是主要问题,3. 第二个很奇怪如果在public void keyReleased(KeyEvent e) { 内,将所有这些代码行移动到ListSelectionListener,因为这些事件与KeyListener 无关, 4. 再次不要混淆用户,鼠标和键事件应该是相同的,否则你必须覆盖鼠标事件也一样,尽量避免造成混乱
  • @mKorbel 你是对的!我同意:)

标签: java swing nullpointerexception jtable


【解决方案1】:

有几件事不对...

  1. 避免使用KeyListener,与使用KeyListeners 相关的问题很多,key bindings API 修复了这些问题
  2. 您使用table.setRowSelectionInterval(rowCount-1,rowCount-1); 选择了行,但rowCount 不再有效,因为您添加了新行
  3. transferFocus 用于将焦点转移到下一个可聚焦组件,这意味着JTable 很可能会失去焦点,很确定这不是您想要的。

例如...

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(4, 4);
                JTable table = new JTable(model);

                InputMap im = table.getInputMap();
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "CellAction");

                ActionMap am = table.getActionMap();
                am.put("CellAction", new CellAction(table));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class CellAction extends AbstractAction {

        private JTable table;

        public CellAction(JTable table) {
            this.table = table;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int column = table.getSelectedColumn();
            int rowCount = table.getRowCount();
            int currentRow = table.getSelectedRow();
            if (currentRow == rowCount - 1) {
                table.editCellAt(currentRow, column);
            }
            if (column == 3 && currentRow == rowCount - 1) {
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                Vector row = new Vector();
                row.add(null);
                row.add(null);
                row.add(null);
                row.add(null);

                model.addRow(row);
            }
            if (column == 3) {
                currentRow++;
                column = 0;
                table.setRowSelectionInterval(currentRow, currentRow);
                table.setColumnSelectionInterval(column, column);
                table.editCellAt(currentRow, column);
            }
        }

    }

}

【讨论】:

  • table.setRowSelectionInterval(currentRow, currentRow); table.setColumnSelectionInterval(column, column); table.editCellAt(currentRow, column); 插入新行后 currentRow 正在重置!!我的意思是在插入新行后,如果 currentRow 现在是 1,它会重置为 0 :(
  • 嘿,非常感谢@MadProgrammer,您想到了使用ActionMapInputMap,这太疯狂了! :)
【解决方案2】:

好像是拼写错误,改一下就行了

table.setRowSelectionInterval(rowCount-1,rowCount-1);

jTable1.setRowSelectionInterval(rowCount-1,rowCount-1);

因为table 为空。无论您在哪里使用jTable1

【讨论】:

  • 现在没有抛出空点异常但没有选择新插入的行!!
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2023-03-24
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多