有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JButton在JTable中选择行时不重新启用

我试图在创建按钮时将其设置为enabled(假),当我选择Jtable上的任何一行时,该按钮变为enabled(真)

这里的逻辑非常简单,但由于某种原因,它不太起作用,按钮永远不会进入启用状态(true)

    JButton btnIniciarReparacin = new JButton("INICIAR REPARACI\u00D3N");
    
    btnIniciarReparacin.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            tiempoStart = (int) (System.currentTimeMillis() / 1000L);
            btnIniciarReparacin.setEnabled(false);
        }
    });
    btnIniciarReparacin.setFont(new Font("SansSerif", Font.BOLD, 13));
    btnIniciarReparacin.setBackground(new Color(231, 111, 81));
    btnIniciarReparacin.setBounds(129, 625, 254, 50);
    frame.getContentPane().add(btnIniciarReparacin);
    
    int row = table.getSelectedRow();
    //Comprobamos si hemos cogido algo de la tabla y si los botones están encendidos
    if (table.isRowSelected(row)) {
        btnIniciarReparacin.setEnabled(true);
    } else {
        btnIniciarReparacin.setEnabled(false);
    }

共 (1) 个答案

  1. # 1 楼答案

    Swing GUI的工作是向事件添加侦听器,然后响应侦听器中的状态更改

    在创建组件的代码中,您似乎正在检查行选择状态,这永远不会起作用,因为它只检查一次状态,而且在用户有机会进行选择之前。相反,您需要在JTable上使用一个侦听器,更具体地说,是一个ListSelectionListener,您可以通过table.getSelectionModel().addListSelectionListener(...)将它添加到JTable的选择模型中

    还请注意:

    int row = table.getSelectedRow();
    if (table.isRowSelected(row)) {
        btnIniciarReparacin.setEnabled(true);
    } else {
        btnIniciarReparacin.setEnabled(false);
    }
    

    可以缩短为:

    int row = table.getSelectedRow();
    btnIniciarReparacin.setEnabled(table.isRowSelected(row));
    

    例如:

    table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
        public void valueChanged(ListSelectionEvent event) {
            int row = table.getSelectedRow();
            btnIniciarReparacin.setEnabled(table.isRowSelected(row));
        }
    });
    

    例如,如果按钮删除一行:

    import java.awt.BorderLayout;
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.table.DefaultTableModel;
    
    @SuppressWarnings("serial")
    public class Test01 extends JPanel {
        private static final String[] COLUMNS = {"One", "Two", "Three", "Four"};
        private DefaultTableModel tableModel = new DefaultTableModel(COLUMNS, 0);
        private JTable table = new JTable(tableModel);
        private JButton deleteRowButton = new JButton("Delete Row");
        
        public Test01() {
            int tableRows = 20;
            for (int i = 0; i < tableRows; i++) {
                Integer[] row = new Integer[COLUMNS.length];
                for (int j = 0; j < row.length; j++) {
                    row[j] = (int) (100 * Math.random());
                }
                tableModel.addRow(row);
            }
            
            table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
                
                @Override
                public void valueChanged(ListSelectionEvent e) {
                    int row = table.getSelectedRow();
                    deleteRowButton.setEnabled(table.isRowSelected(row));
                }
            });
            
            deleteRowButton.addActionListener(e -> {
                int row = table.getSelectedRow();
                tableModel.removeRow(row);
            });
            deleteRowButton.setEnabled(false);
            JPanel bottomPanel = new JPanel();
            bottomPanel.add(deleteRowButton);
            
            setLayout(new BorderLayout());
            add(new JScrollPane(table));
            add(bottomPanel, BorderLayout.PAGE_END);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    
        private static void createAndShowGui() {
            Test01 mainPanel = new Test01();
            JFrame frame = new JFrame("Test01");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    }