javaswingjtablelistselectionlistener

JTable getSelectedRow does not return the selected row index


I try to get data in the row that is selected but getSelectedRow() doesn't work. Actually, I used that method in the other class, but it works in there. When I try to print the row index; the prompt shows -1; as not selected.

I tried most of solutions that are on the internet but they didn't solve my solutions.

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

Solution

  • Look to your code

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

    You add jTable1 to the JScrollPane at first and only then you create jTable1. It's incorrect way. jTable1 variable doen't linked now with table you place at the form. I think it's cause of your problem.

    Move creation of the jTable1 before adding in into JScrollPane.

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