JTable和JButton点击不起作用

时间:2017-05-09 10:21:05

标签: java swing jtable jbutton actionlistener

我有一个JPanel持有JButton和JScrollPane(反过来持有JTable),目前我遇到了两个我认为相关的问题:

单击时不会调用JButton侦听器的actionPerformed()方法。我可以调用它的唯一方法是在JButton上调用doClick()。 JButton颜色在悬停时会发生变化,但按下鼠标时不会显示任何点击动画。

其次,如果在JTable中单击一个单元格,则位于同一列中的两行向下的单元格将注册该单击。单击列标题(即调整单元格宽度)时,仅当在单元格区域内时,才会发生此偏移。

Left-hand panel. Click position circled

public class InventoryPanel extends JPanel {

// Parent Business object reference for communication and JFrame
private Business parent;
private AddItemPanel addItemPanel;
// Inventory table items
private DefaultTableModel inventoryModel;
private JTable inventoryTable;
private JScrollPane inventoryScrollPane;
private JLabel updateLbl;
private JButton addItemBtn;
// Columns for inventory table
private static final String[] INVENTORY_COLUMNS = {"Item","Stock","Restocking Level","Edit"};

public InventoryPanel(Business parent) {
    this.parent = parent;

    initGUI();

    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                //doStuff
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace(new PrintStream(System.out));
                }
            }
        }
    }).start();
}

// INITIALISES GUI
public void initGUI() {
    this.setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));
    this.setBorder(BorderFactory.createLineBorder(Color.BLACK));

    JLabel titleLabel = new JLabel("<html><B>Inventory</B></html>");
    this.add(titleLabel);

    // Create empty inventory table
    inventoryModel = new DefaultTableModel(new Object[3][4],INVENTORY_COLUMNS);
    inventoryTable = new JTable(inventoryModel);
    inventoryScrollPane = new JScrollPane(inventoryTable);

    // Create button to allow items to be added
    addItemBtn = new JButton("Add item");
    addItemBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("ADD ITEM PRESSED");
        }
    });

    updateLbl = new JLabel("Loading inventory...");

    this.add(addItemBtn);
    this.add(inventoryScrollPane);
    this.add(updateLbl);
}

我已经尝试从面板中移除该表以查看是否解决了JButton问题,反之亦然,但没有运气。我也试过改变项目JDK,但也没有运气。

在JFrame中有一些麻烦的JPanel附近工作得非常好。有什么想法吗?

编辑:我可以在另一个项目的框架中单独创建InventoryPanel的工作实例,如评论中所述。但是,当前项目中完全相同的代码(不对其他对象/方法进行调用)现在会生成ClassCastExceptions。经过一些谷歌搜索后,这似乎是由于非EDT线程更新GUI。 但是没有使用Business类,所有GUI操作都是使用SwingUtilities.invokeLater()方法执行的,如下所示:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new JFrame("test");
            frame.add(new InventoryPanel());
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

注意:无参数构造函数InventoryPanel()只调用initGUI()。

感谢迄今为止的帮助......仍然对此非常困惑。

0 个答案:

没有答案