0

I want to use a CardLayout to use several JTable and with that the JTable.getSelectedRow() doesn't work. Here is what I've tried:

public void createWindow() {
        // creation du tableau d'article

        this.ajouterLesArticles();

        // Contener principal
        main = new JPanel();
        this.setContentPane(main);
        main.setLayout(new BorderLayout());

        // Panel du haut
        top = new JPanel();
        title = new JLabel(titlewindow);
        welcome = new JLabel("Bonjour, ");
        top.setLayout(new BoxLayout(top, BoxLayout.LINE_AXIS));
        top.setBackground(Color.decode("#E5E5E5"));
        title.setForeground(Color.decode("#E56302"));
        title.setFont(new Font("Calibri", Font.PLAIN, 20));
        welcome.setFont(new Font("Calibri", Font.PLAIN, 20));
        welcome.setForeground(Color.decode("#E56302"));

        // Ajout des composants au panel
        top.add(Box.createRigidArea(new Dimension(50, 100)));
        top.add(title);
        top.add(Box.createHorizontalGlue());
        top.add(welcome);
        top.add(Box.createRigidArea(new Dimension(40, 100)));
//      top.add(piclabel);
        top.add(Box.createRigidArea(new Dimension(60, 100)));

        // Panel de Gauche
        left = new JPanel();
        left.setLayout(new GridLayout(6, 1));
        left.setPreferredSize(new Dimension(150, 0));
        left.setBackground(Color.decode("#E5E5E5"));
        home = new JButton("<-- Accueil");
        btnleft1 = new JButton(labels[0]);
        btnleft2 = new JButton(labels[1]);
        btnleft3 = new JButton(labels[2]);
        btnleft4 = new JButton(labels[3]);

        // Listeners des boutons de gauche
//      btnleft4.addActionListener(new OpenParametres());
        btnleft1.addActionListener(new  changerPanelStock());
        btnleft2.addActionListener(new changerPanelClient());
//      home.addActionListener(new BackHome());

        // Ajout des composants au Panel
        left.add(home);
        left.add(btnleft1);
        left.add(btnleft2);
        left.add(btnleft3);
        left.add(btnleft4);

        // Panel central
        center = new JPanel();
        center.setLayout(cl);
        center.setBorder(new EmptyBorder(10, 10, 10, 10));
        center.add(creationPanelStock(), "stock");
        center.add(creationPanelClient(), "client");
        cl.show(center,"stock");

        // Ajout des panel au panel principal
                main.add(top, BorderLayout.NORTH);
                main.add(left, BorderLayout.WEST);
                main.add(center, BorderLayout.CENTER);
    }

    public JPanel creationPanelStock(){

        this.ajouterLesArticles();

        line1 = new JPanel();
        line2 = new JPanel();
        line3 = new JPanel();

        searchtitle = new JLabel("Rechercher un article : ");
        tfsearch = new JTextField();
        tfsearch.setColumns(22);
        tfsearch.getDocument().addDocumentListener(new Filtre());
        gsearch = new TextPrompt("Entrez un nom ou une référence",tfsearch);
        add = new JButton ("Créer un article...");
        remove = new JButton ("Supprimer...");
        modify = new JButton ("Modifer...");
        modify.setEnabled(false);
        modify.addActionListener(new modifierArticle());
        remove.setEnabled(false);
        remove.addActionListener(new supprimer());
        search = new JButton ("Rechercher");
        listeArticle.setSize(300,100);
        listeArticle.getSelectionModel().addListSelectionListener(new selectionliste());
        listeArticle.setAutoCreateRowSorter(true);
        //liste.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


        //Première ligne de "center"
        line1.add(add);
        add.addActionListener(new NewArticle());
        line1.add(modify);
        line1.add(remove);

        //Deuxième ligne de "center"
        line2.add(searchtitle);
        line2.add(tfsearch);
        line2.add(search);

        //troisième ligne de "center"
        JScrollPane js = new JScrollPane(listeArticle);
        js.setPreferredSize(new Dimension(600,120));
        line3.add(js);

        panelStock = new JPanel(new GridLayout(3,1,10,10));
        panelStock.add(line1);
        panelStock.add(line2);
        panelStock.add(line3);

        return panelStock;
    }

I create windows with two panel and each of them has a JTable but I can't selected anything, and this listener doesn't work:

public class selectionliste implements ListSelectionListener{

        @Override
        public void valueChanged(ListSelectionEvent e) {
            // TODO Auto-generated method stub
            if (listeArticle.getSelectedRow() > -1) {
                modify.setEnabled(true);
                remove.setEnabled(true);
            }else{
                modify.setEnabled(false);
                remove.setEnabled(false);
            }

        }

    }
metasim
  • 4,793
  • 3
  • 46
  • 70
  • 1
    1) For better help sooner, post a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). 2) Why not have a single table and display different table models according to user choice? – Andrew Thompson Jun 05 '16 at 13:33

1 Answers1

1

The table's ListSelectionModel uses -1 to indicate that the selection is empty. In the example below, each card gets its own table, and each table gets its own listener. Flip among the cards to see how the selection "sticks" to the table in each card.

image

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * @see http://stackoverflow.com/a/37644011/230513
 * @see http://stackoverflow.com/a/36392696/230513
 * @see http://stackoverflow.com/a/36243395/230513
 */
public class CardPanel extends JPanel {

    private static final Random r = new Random();
    private static final JPanel cards = new JPanel(new CardLayout());
    private final String name;

    public CardPanel(String name) {
        super(new GridLayout(0, 1));
        this.name = name;
        this.add(new JLabel(name, JLabel.CENTER));
        JTable table = new JTable(new String[][]{
            {"A0", "B0"}, {"A1", "B1"}
        }, new String[]{"A", "B"});
        this.add(table);
        JLabel label = new JLabel("None", JLabel.CENTER);
        this.add(label);
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    label.setText("Selected row: " + table.getSelectedRow());
                }
            }
        });
    }

    @Override
    public String toString() {
        return name;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for (int i = 1; i < 9; i++) {
            CardPanel p = new CardPanel("Table " + String.valueOf(i));
            cards.add(p, p.toString());
        }
        JPanel control = new JPanel();
        control.add(new JButton(new AbstractAction("\u22b2Prev") {

            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout) cards.getLayout();
                cl.previous(cards);
            }
        }));
        control.add(new JButton(new AbstractAction("Next\u22b3") {

            @Override
            public void actionPerformed(ActionEvent e) {
                CardLayout cl = (CardLayout) cards.getLayout();
                cl.next(cards);
            }
        }));
        f.add(cards, BorderLayout.CENTER);
        f.add(control, BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
trashgod
  • 203,806
  • 29
  • 246
  • 1,045