【问题标题】:Using CardLayout with a JTable, and JTable.getSelectedRow() always returns -1将 CardLayout 与 JTable 一起使用,并且 JTable.getSelectedRow() 始终返回 -1
【发布时间】:2016-10-05 03:52:16
【问题描述】:

我想使用CardLayout 来使用多个JTable,这样JTable.getSelectedRow() 就不起作用了。这是我尝试过的:

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

我用两个面板创建窗口,每个面板都有一个JTable,但我不能选择任何东西,而且这个监听器不起作用:

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

        }

    }

【问题讨论】:

标签: java swing jtable cardlayout


【解决方案1】:

表格的ListSelectionModel 使用-1 表示选择为空。在下面的示例中,每张卡都有自己的表,每个表都有自己的侦听器。在卡片之间翻转,看看选择是如何“粘”在每张卡片的桌子上的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2011-09-25
    • 2017-08-10
    • 2014-03-20
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多