有 Java 编程相关的问题?

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

java JButton的操作侦听器在JTable中不工作

我在JTable中有按钮。我已经将ActionListener添加到这些Buton中,但是当我单击“编辑”时,什么都没有发生

enter image description here

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.nio.ByteOrder;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.border.EmptyBorder;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class eSCCMyView extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;

final int WIDTH_FRAME = 800;
final int HEIGHT_FRAME = 600;
final int x_frame = 0;
final int y_frame = 0;

private JPanel motherPanel = null;
private JButton bt_edit = new JButton("Edit");

private JTable tableA = null;
private JTable tableB = null;

private Object[] colNames = {"Col-1", "Col-2", "Col-3", "Button1", "Col-4", "Col-5", "Col-6", "Button2"};
private Object[][] data = {
                   {"One", "Two", "Three", bt_edit, "Four", "Five", "Six", bt_edit},
                   {"Four", "Five", "Six", bt_edit, "Four", "Five", "Six", bt_edit},
                   {"Four", "Five", "Six", bt_edit, "Four", "Five", "Six", bt_edit},
                   {"Four", "Five", "Six", bt_edit, "Four", "Five", "Six", bt_edit}
                   };

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {

        public void run() {
            try {
                JFrame eSCCFrame = new eSCCMyView();
                eSCCFrame.setVisible(true);
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public eSCCMyView() {
    setTitle("eSCC My View");
    setBounds(x_frame, y_frame, WIDTH_FRAME, HEIGHT_FRAME);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    /*
     *  motherPanel is the main panel to which we add all the panels.
     */
    motherPanel = new JPanel();
    motherPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
    motherPanel.setLayout(new BorderLayout(0, 0));
    setContentPane(motherPanel);

    /*
     * A panel is added to mother panel to add the splitPanel;
     */
    JPanel panel2AddSplit = new JPanel();
    motherPanel.add(panel2AddSplit, BorderLayout.CENTER);
    panel2AddSplit.setLayout(new BorderLayout(0, 0));

    /*
     * Add a splitPanel on top of panel2AddSplit;
     */
    JSplitPane splitPane = new JSplitPane();
    panel2AddSplit.add(splitPane, BorderLayout.CENTER);

    /*
     * Add a panel to the left of the left of the splitPanel;
     */
    JPanel pl_leftTree = new JPanel();
    splitPane.setLeftComponent(pl_leftTree);
    pl_leftTree.setBackground(Color.WHITE);
    splitPane.setResizeWeight(0.1);

    /*
     * Add tree to the left panel;      
     */
    JTree tree = new JTree();
    pl_leftTree.add(tree, BorderLayout.CENTER);

    /*
     * Add a right panel to the splitPane;
     */
    JPanel pl_rightPanel = new JPanel();
    pl_rightPanel.setLayout(new BorderLayout(0, 0));
    splitPane.setRightComponent(pl_rightPanel);

    /*
     * This panel is used to add buttons, comboBoxes, checkBoxes
     */
    JPanel pl_toAddButtons = new JPanel();
    pl_rightPanel.add(pl_toAddButtons, BorderLayout.NORTH);

    JLabel lb_plant = new JLabel("Plant");
    pl_toAddButtons.add(lb_plant);

    ImageIcon image = new ImageIcon("SampleView/images/Arrow.png");
    JButton bt_imageButton = new JButton(image);
    pl_toAddButtons.add(bt_imageButton);

    JLabel lb_subPlant = new JLabel("Sub-Plant");
    pl_toAddButtons.add(lb_subPlant);

    JButton bt_arrowButton = new JButton(" -> ");
    pl_toAddButtons.add(bt_arrowButton);

    JCheckBox ck_boxActive = new JCheckBox("Lab Active");
    pl_toAddButtons.add(ck_boxActive);

    JCheckBox ck_boxLimit = new JCheckBox("LT");
    pl_toAddButtons.add(ck_boxLimit);

    JComboBox cb_box = new JComboBox();
    cb_box.setModel(new DefaultComboBoxModel(new String []{"0 - 100", "101 - 1000", "1001 - 1500"}));
    pl_toAddButtons.add(cb_box);

    /*
     * To add a tab to the rightPanel;
     */
    JTabbedPane tabPane = new JTabbedPane(JTabbedPane.TOP);
    pl_rightPanel.add(tabPane, BorderLayout.CENTER);

    JPanel pl_firsttabPanel = new JPanel();
    tabPane.addTab("First", null, pl_firsttabPanel, null);
    pl_firsttabPanel.setBackground(Color.WHITE);
    pl_firsttabPanel.setLayout(new BorderLayout(0, 0));

    JPanel pl_secondtabPanel = new JPanel();
    tabPane.addTab("Second", null, pl_secondtabPanel, null);
    pl_secondtabPanel.setLayout(new BorderLayout(0, 0));
    /*
     * In this second tab you need to create a splitpane as a component;
     */
    //JSplitPane sp_secondTab = new JSplitPane();
    //sp_secondTab.setT

    JPanel pl_inSecondTabPanel = new JPanel();
    pl_secondtabPanel.add(pl_inSecondTabPanel, BorderLayout.CENTER);
    pl_inSecondTabPanel.setLayout(new BorderLayout(0, 0));

    JPanel pl_inSecondPanelTwo = new JPanel();
    pl_secondtabPanel.add(pl_inSecondPanelTwo, BorderLayout.SOUTH);
    pl_inSecondPanelTwo.setLayout(new BorderLayout(0, 0));

    JPanel pl_bottomPanelInSecondTab = new JPanel();
    pl_inSecondPanelTwo.add(pl_bottomPanelInSecondTab, BorderLayout.SOUTH);

    /*
     *  The following 3-buttons Save, Save & Send, Supply-Chain are present in the secondTab's Panel;
     */
    JButton bt_save = new JButton("Save");
    pl_bottomPanelInSecondTab.add(bt_save);

    JButton bt_savenSend = new JButton("Save & Send");
    pl_bottomPanelInSecondTab.add(bt_savenSend);

    JButton bt_supplyChain = new JButton("Supply Chain");
    pl_bottomPanelInSecondTab.add(bt_supplyChain);

    /*
     * We need a panel to add SplitPane in the existing two panels in the secondTab;
     */
    JPanel pl_forSplitPanel = new JPanel();
    pl_forSplitPanel.setLayout(new BorderLayout(0, 0));
    pl_inSecondTabPanel.add(pl_forSplitPanel, BorderLayout.CENTER);

    JSplitPane sp_inSecondTab = new JSplitPane();
    sp_inSecondTab.setOrientation(JSplitPane.VERTICAL_SPLIT);
    pl_forSplitPanel.add(sp_inSecondTab, BorderLayout.CENTER);

    /*
     * Assign two tables say tableA, tableB to the splitPane sp_inSecondTab;
     */
    //JTable tableA = new JTable(data, colNames);
    tableA = new JTable(new CustomModelForTable(colNames, data));
    JTableHeader tableAHeader = tableA.getTableHeader();
    tableAHeader.setBackground(Color.GRAY);

    TableCellRenderer defaultRenderer = tableA.getDefaultRenderer(JButton.class);
    tableA.setDefaultRenderer(JButton.class, new JButtonRendererClass(defaultRenderer));

    //tableB = new JTable(data, colNames);
    tableB = new JTable(new CustomModelForTable(colNames, data));
    tableAHeader = tableB.getTableHeader();
    tableAHeader.setBackground(Color.GRAY);
    TableCellRenderer tableBRenderer = tableB.getDefaultRenderer(JButton.class);
    tableB.setDefaultRenderer(JButton.class, new JButtonRendererClass(tableBRenderer));


    sp_inSecondTab.setLeftComponent(new JScrollPane(tableA));
    sp_inSecondTab.setRightComponent(new JScrollPane(tableB));
    sp_inSecondTab.setOneTouchExpandable(true);
    sp_inSecondTab.setResizeWeight(0.5);

    // Add ActionListener to bt_edit button;
    bt_edit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int row = tableA.getSelectedRow();
            System.out.println("Row Selected is: " + row);
            CustomModelForTable cus = (CustomModelForTable) tableA.getModel();
            cus.removeRow(row);
        }
    });
}
}

p.S:我为代码末尾的按钮添加了操作侦听器


共 (2) 个答案

  1. # 2 楼答案

    我认为,虽然按钮显示在表格上,但它实际上不是一个按钮,而是一个呈现为按钮的单元格

    你可以听一下表格的模型,看看用户何时点击了一个有按钮的单元格,并在这种情况下采取行动