java jbutton 不可点击_JTable和JButton点击不起作用

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

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

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

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("Inventory");

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

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

JTable 是一个非常常见的 Java Swing 控件,它可以方便地展示数据。如果数据量比较大,我们往往需要进行分页查看。下面是 JTable 分页查询的完整实现: 首先,我们需要定义一个分页类 PagingModel,用来管理分页相关的信息,如当前页码、每页显示的行数、总记录数等等。代码如下: ```java public class PagingModel { private int currentPage; // 当前页码 private int pageSize; // 每页显示的行数 private int totalRecords; // 总记录数 private int totalPages; // 总页数 public PagingModel(int pageSize, int totalRecords) { this.currentPage = 1; this.pageSize = pageSize; this.totalRecords = totalRecords; this.totalPages = (totalRecords + pageSize - 1) / pageSize; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalRecords() { return totalRecords; } public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; this.totalPages = (totalRecords + pageSize - 1) / pageSize; } public int getTotalPages() { return totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getFirstResult() { return (currentPage - 1) * pageSize; } public int getMaxResults() { return pageSize; } public boolean isFirstPage() { return currentPage == 1; } public boolean isLastPage() { return currentPage == totalPages; } public void nextPage() { if (!isLastPage()) { currentPage++; } } public void previousPage() { if (!isFirstPage()) { currentPage--; } } } ``` 接下来,我们需要定义一个数据模型类,用来管理 JTable 的数据。代码如下: ```java public class MyTableModel extends AbstractTableModel { private List<Object[]> data; private String[] columnNames; public MyTableModel(List<Object[]> data, String[] columnNames) { this.data = data; this.columnNames = columnNames; } @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int columnIndex) { return columnNames[columnIndex]; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return data.get(rowIndex)[columnIndex]; } public void setData(List<Object[]> data) { this.data = data; fireTableDataChanged(); } } ``` 其中,data 是一个 List,用来存储 JTable 的数据。每个元素都是一个 Object[],代表一行数据。columnNames 是一个 String[],用来存储 JTable 的列名。 接下来,我们需要定义一个分页查询的方法,用来查询数据并更新 JTable。代码如下: ```java public void queryDataByPage(int pageNum) { PagingModel pagingModel = new PagingModel(pageSize, totalRecords); pagingModel.setCurrentPage(pageNum); List<Object[]> data = // 执行查询语句,获取数据 myTableModel.setData(data); jTable.setModel(myTableModel); updatePageStatus(pagingModel); } private void updatePageStatus(PagingModel pagingModel) { currentPageLabel.setText(pagingModel.getCurrentPage() + ""); totalPagesLabel.setText(pagingModel.getTotalPages() + ""); totalRecordsLabel.setText(pagingModel.getTotalRecords() + ""); previousButton.setEnabled(!pagingModel.isFirstPage()); nextButton.setEnabled(!pagingModel.isLastPage()); } ``` 其中,pageSize 表示每页显示的行数,totalRecords 表示总记录数。我们先根据当前页码和总记录数计算出总页数,然后执行查询语句,获取数据。最后,更新 JTable 的数据模型和分页相关的信息。 最后,我们需要在界面上添加一些组件,如 JTable、分页按钮、分页信息等等。代码如下: ```java JTable jTable = new JTable(); MyTableModel myTableModel = new MyTableModel(new ArrayList<>(), new String[]{/* 列名 */}); int pageSize = 10; int totalRecords = // 执行查询语句,获取总记录数 PagingModel pagingModel = new PagingModel(pageSize, totalRecords); JButton previousButton = new JButton("上一页"); JButton nextButton = new JButton("下一页"); JLabel currentPageLabel = new JLabel(pagingModel.getCurrentPage() + ""); JLabel totalPagesLabel = new JLabel(pagingModel.getTotalPages() + ""); JLabel totalRecordsLabel = new JLabel(pagingModel.getTotalRecords() + ""); previousButton.addActionListener(e -> { pagingModel.previousPage(); queryDataByPage(pagingModel.getCurrentPage()); }); nextButton.addActionListener(e -> { pagingModel.nextPage(); queryDataByPage(pagingModel.getCurrentPage()); }); JPanel pagePanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); pagePanel.add(previousButton); pagePanel.add(currentPageLabel); pagePanel.add(new JLabel("/")); pagePanel.add(totalPagesLabel); pagePanel.add(nextButton); JPanel infoPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); infoPanel.add(new JLabel("共 " + totalRecordsLabel + " 条记录")); JFrame frame = new JFrame(); frame.add(new JScrollPane(jTable), BorderLayout.CENTER); frame.add(pagePanel, BorderLayout.SOUTH); frame.add(infoPanel, BorderLayout.NORTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); ``` 其中,上一页和下一页按钮的 ActionListener 中分别调用 queryDataByPage 方法来更新 JTable 和分页信息。界面上方显示分页信息,下方显示 JTable 和分页按钮。 以上就是 JTable 分页查询的完整实现。需要注意的是,这里只是一个简单的示例,实际应用中可能需要处理更多的异常情况和分页相关的细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值