JTable getSelectedRow不返回选定的行索引

我尝试获取所选行的数据,但getSelectedRow()不起作用。 实际上,我在另一个class里使用了这个方法,但是在那里工作。 当我尝试打印行索引时; 提示符显示-1; 因为没有select。

我尝试了大多数在互联网上的解决scheme,但他们并没有解决我的解决scheme。

 public Canteen() { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.getContentPane().setLayout( null ); this.setSize( new Dimension(400, 300) ); this.setTitle( "CANTEEN" ); jScrollPane1.setBounds(new Rectangle(0, 0, 230, 235)); jButton1.setText("REFRESH"); jButton1.setBounds(new Rectangle(0, 235, 100, 20)); jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jButton1_actionPerformed(e); } }); jButton2.setText("CLOSE"); jButton2.setBounds(new Rectangle(120, 235, 110, 20)); jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jButton2_actionPerformed(e); } }); jScrollPane1.getViewport().add(jTable1, null); this.getContentPane().add(jButton2, null); this.getContentPane().add(jButton1, null); this.getContentPane().add(jScrollPane1, null); jTable1 = new JTable (model); String header [] = {"CUSTOMER", "PRODUCT", "QUANTITY","ORDER NO"}; for (int i = 0; i < 4; i++){ model.addColumn(header[i]); } //refresh every 1 minute Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask(){ public void run(){ model.setRowCount(0); try { Class.forName(driverName); conn = DriverManager.getConnection(url,username, password); statement = conn.createStatement(); ResultSet rs = statement.executeQuery("SELECT USER_NAME, QUANTITY, PRD_NAME, ORDER_NUMBER FROM ORDERS ORDER BY ORDER_NUMBER DESC"); int count = rs.getRow(); String user [] = new String [count]; int i = 0; while (rs.next()){ String name = rs.getString(1); String prdName = rs.getString(3); int number = rs.getInt(2); int orderNumber = rs.getInt(4); model.insertRow(i,new Object []{name,prdName,number, orderNumber}); } conn.close(); } catch (ClassNotFoundException s) { System.out.println("Couldn't find the database driver"); System.out.println(s); } catch (SQLException s) { System.out.println("Couldn't connect to the database\n" +s); } } },0, 60000); } private void jButton1_actionPerformed(ActionEvent e) { //set from row 0 for refresh model.setRowCount(0); try { Class.forName(driverName); conn = DriverManager.getConnection(url,username, password); statement = conn.createStatement(); ResultSet rs = statement.executeQuery("SELECT USER_NAME, QUANTITY, PRD_NAME FROM ORDERS ORDER BY ORDER_NUMBER DESC"); int count = rs.getRow(); String user [] = new String [count]; int i = 0; while (rs.next()){ String name = rs.getString(1); String prdName = rs.getString(3); int number = rs.getInt(2); model.insertRow(i,new Object []{name,prdName,number}); } conn.close(); } catch (ClassNotFoundException s) { System.out.println("Couldn't find the database driver"); System.out.println(s); } catch (SQLException s) { System.out.println("Couldn't connect to the database\n" +s); } } private void jButton2_actionPerformed(ActionEvent e) { System.out.println(jTable1.getSelectedRow()); } } 

看看你的代码

 private void jbInit() throws Exception { ... jScrollPane1.getViewport().add(jTable1, null); this.getContentPane().add(jButton2, null); this.getContentPane().add(jButton1, null); this.getContentPane().add(jScrollPane1, null); jTable1 = new JTable (model); ... 

您首先将jTable1添加到JScrollPane ,然后才创buildjTable1 。 这是不正确的方式。 现在, jTable1variables不会与表格中的表格链接在一起。 我认为这是你的问题的原因。

在添加到JScrollPane之前移动jTable1创build。

 ... jTable1 = new JTable (model); jScrollPane1.getViewport().add(jTable1, null); this.getContentPane().add(jButton2, null); this.getContentPane().add(jButton1, null); this.getContentPane().add(jScrollPane1, null); ... 

正如你的另一个例子所示, getSelectedRow()确实有效,所以你将不得不debugging你的代码。 与下面的sscce比较可能会提出前进的道路。 ActionListenerListSelectionListener显示选中的行。

图片

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; /** * @see http://stackoverflow.com/q/12301923/230513 */ public class TableSelection extends JPanel { private static final String SHOW = "Show"; private DefaultTableModel model = new DefaultTableModel(); private JTable table = new JTable(model); private JButton button = new JButton(new AbstractAction(SHOW) { @Override public void actionPerformed(ActionEvent e) { System.out.println(table.getSelectedRow()); } }); public TableSelection() { model.addColumn("Column"); for (int i = 0; i < 16; i++) { model.addRow(new Object[]{i}); } table.setPreferredScrollableViewportSize(new Dimension(160, 100)); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getSelectionModel().addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { button.setText(SHOW + " " + table.getSelectedRow()); } } }); this.add(new JScrollPane(table)); table.setRowSelectionInterval(3, 3); } private void display() { JFrame f = new JFrame("TableSelection"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this, BorderLayout.CENTER); f.add(button, BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new TableSelection().display(); } }); } }