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

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

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

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中,还有其他JPanels与麻烦的相邻,可以很好地工作 . 有任何想法吗?

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

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() .

感谢您的帮助到目前为止...仍然非常困惑 .