插入行选择jTable

Inserted Row Selection jTable

我有一个 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          

 }

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);

      }

    }



  }



}

有几件事不对...

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

    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          
    
     }
    
    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(rowCount-1,rowCount-1);

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

    因为 table 为空。在你使用 jTable1.

    的任何地方


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161