我有一个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()。
感谢迄今为止的帮助......仍然对此非常困惑。