JScrollPane中的IntelliJ JTable [英] IntelliJ JTable in JScrollPane

查看:131
本文介绍了JScrollPane中的IntelliJ JTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用IntelliJ GUI Builder为我的应用程序设计GUI。其中, JScrollPane 中的 JTable 似乎无法正常工作。首先,我无法显示列标题。其次,表单击不起作用。它就好像我从实际上我点击了3行,在默认行选择和任何 MouseListeners 我实现。最后,如果表超过 JScrollPane 的大小,它只会忽略最后的X行,并且不提供滚动条来查看它们。

I'm using IntelliJ GUI Builder to design a GUI for my application. In it, there is a JTable inside a JScrollPane that doesn't seem to be working. Firstly, I can't get the column headers to display. Second, table clicking is not working. It acts as if I'm clicking 3 rows down from where I actually am, both in default row selection and in any MouseListeners I implement. Lastly, if the table exceeds the size of the JScrollPane, it just ignores the last X rows and doesn't provide a scroll bar to view them.

我现在重做了几次项目,尝试扩展 AbstractTableModel ,然后 DefaultTableModel ,最近我尝试完全抛弃自定义 TableModel ,只使用 DefaultTableModel 构造函数无济于事。以下是所有相关代码(其中一些是由GUI Builder自动生成的,我无法直接修改它)。

I've reworked the project a couple times now, trying extensions of AbstractTableModel, then DefaultTableModel, and lately I have tried ditching a custom TableModel altogether and just using a DefaultTableModel constructor to no avail. Here is all relevant code (some of it is auto-generated by the GUI Builder and I can't modify it directly).

BaldGUI.java (主要的gui)

package client;

import client.DataTypes.Record;
import client.DataTypes.RecordSet;
import client.GuiElements.FileTree;
import client.GuiElements.RecordsTable;
import client.GuiElements.TextConsole;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;

public class BaldGUI extends JFrame {

//Menu
private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu = new JMenu("File");
private JMenuItem newBatchItem = new JMenuItem("New Batch");
private JMenuItem saveBatchItem = new JMenuItem("Save Batch");
private JMenuItem loadBatchItem = new JMenuItem("Load Batch");

private static String rootDir = "C:/Users/wf1946/IdeaProjects/DocumentumLoaderTest01/data";

private JPanel mainPanel;
private JPanel LeftSideBarPanel;
private JTree fileTree;
private JButton AddFileButton;
private JButton ChangeDirectoryButton;
private JButton AddDirectoryButton;
private JCheckBox IncludeSubDirectoriesCheckBox;
private JScrollPane DataTableWrapper;
private JTable DataTable;
private JEditorPane Console;
private JScrollPane ConsoleScroller;

public BaldGUI() {
    $$$setupUI$$$();
    this.loadComponents();

    this.AddFileButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            ((RecordsTable) DataTable).addItem(new Record());
        }
    });

    this.add(this.mainPanel);
}

private void loadComponents() {
    //Menu
    this.setJMenuBar(this.menuBar);
    this.menuBar.add(this.fileMenu);
    this.fileMenu.add(this.newBatchItem);
    this.fileMenu.add(this.saveBatchItem);
    this.fileMenu.add(this.loadBatchItem);

    //Selection handler for the file tree
    this.fileTree.addTreeSelectionListener(new TreeSelectionListener() {
        @Override
        public void valueChanged(TreeSelectionEvent e) {

            TreePath path = e.getPath();

            if (!fileTree.getModel().isLeaf(path.getLastPathComponent())) { //Directory
                AddDirectoryButton.setEnabled(true);
                IncludeSubDirectoriesCheckBox.setEnabled(true);
                AddFileButton.setEnabled(false);
            } else { //File
                AddFileButton.setEnabled(true);
                AddDirectoryButton.setEnabled(false);
                IncludeSubDirectoriesCheckBox.setEnabled(false);
            }

        }
    });
}


//Getters
public JEditorPane getConsole() {
    return Console;
}

public JPanel getMainPanel() {
    return mainPanel;
}

public JTree getFileTree() {
    return fileTree;
}

public JTable getDataTable() {
    return this.DataTable;
}

public JCheckBox getIncludeSubDirectoriesCheckBox() {
    return IncludeSubDirectoriesCheckBox;
}

public JScrollPane getDataTableWrapper() {
    return DataTableWrapper;
}

private void createUIComponents() {
    this.Console = new TextConsole();
    this.fileTree = new FileTree(this, new File(this.rootDir));
    RecordSet rs = new RecordSet();
    for (int i = 0; i < 10; i++) rs.add(new Record());
    this.DataTable = new RecordsTable(new DefaultTableModel(rs.getData(), RecordsTable.colNames), this);
    this.DataTableWrapper = new JScrollPane(this.DataTable);
}

/**
 * Method generated by IntelliJ IDEA GUI Designer
 * >>> IMPORTANT!! <<<
 * DO NOT edit this method OR call it in your code!
 *
 * @noinspection ALL
 */
private void $$$setupUI$$$() {
    createUIComponents();
    mainPanel = new JPanel();
    mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
    mainPanel.setMinimumSize(new Dimension(1080, 810));
    mainPanel.setPreferredSize(new Dimension(1080, 810));
    LeftSideBarPanel = new JPanel();
    LeftSideBarPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
    LeftSideBarPanel.setMinimumSize(new Dimension(220, 35));
    LeftSideBarPanel.setPreferredSize(new Dimension(220, 600));
    mainPanel.add(LeftSideBarPanel);
    fileTree.setPreferredSize(new Dimension(200, 530));
    fileTree.setShowsRootHandles(true);
    LeftSideBarPanel.add(fileTree);
    AddFileButton = new JButton();
    AddFileButton.setPreferredSize(new Dimension(100, 25));
    AddFileButton.setText("Add File");
    LeftSideBarPanel.add(AddFileButton);
    ChangeDirectoryButton = new JButton();
    ChangeDirectoryButton.setPreferredSize(new Dimension(100, 25));
    ChangeDirectoryButton.setText("Change Root");
    LeftSideBarPanel.add(ChangeDirectoryButton);
    AddDirectoryButton = new JButton();
    AddDirectoryButton.setPreferredSize(new Dimension(100, 25));
    AddDirectoryButton.setText("Add Directory");
    LeftSideBarPanel.add(AddDirectoryButton);
    IncludeSubDirectoriesCheckBox = new JCheckBox();
    IncludeSubDirectoriesCheckBox.setPreferredSize(new Dimension(100, 22));
    IncludeSubDirectoriesCheckBox.setText("Subdirectories");
    LeftSideBarPanel.add(IncludeSubDirectoriesCheckBox);
    DataTableWrapper.setPreferredSize(new Dimension(845, 600));
    mainPanel.add(DataTableWrapper);
    DataTable.setFillsViewportHeight(true);
    DataTableWrapper.setViewportView(DataTable);
    ConsoleScroller = new JScrollPane();
    mainPanel.add(ConsoleScroller);
    Console.setEnabled(false);
    Console.setPreferredSize(new Dimension(1070, 195));
    ConsoleScroller.setViewportView(Console);
}

/**
 * @noinspection ALL
 */
public JComponent $$$getRootComponent$$$() {
    return mainPanel;
}
}

RecordsTable.java

RecordsTable.java

package client.GuiElements;

import client.ActionListeners.RightClickMenuItemClick;
import client.ActionListeners.TableRightClickHandler;
import client.BaldGUI;
import client.DataTypes.Record;
import client.DataTypes.RecordSet;

import javax.swing.*;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.util.ArrayList;

//Table to store the records
public class RecordsTable extends JTable {

//Status codes returned to calling functions to indicate the success or failure of the new record
public static final int APPEND_SUCCESS_CODE = 1;
public static final int APPEND_FAIL_DUPLICATE_CODE = 2;
public static final String[] colNames = {"Status", "File", "Full Path", "Title", "Form Date",
    "Form No.", "Language Code", "Filed", "Approval Date", "Filed Form No."};

private RecordSet data = new RecordSet();

//Parent form
BaldGUI parent;

//Right-click menu for table item
JPopupMenu itemRightClickMenu = new JPopupMenu();
JMenuItem itemEdit = new JMenuItem("Edit Record");
JMenuItem itemDelete = new JMenuItem("Remove Record");

public RecordsTable(DefaultTableModel model, BaldGUI form) {
    super(model);
    this.parent = form;

    this.itemRightClickMenu.add(itemEdit);
    this.itemRightClickMenu.add(itemDelete);
    this.itemEdit.addMouseListener(new RightClickMenuItemClick(this, itemEdit));
    this.itemDelete.addMouseListener(new RightClickMenuItemClick(this, itemDelete));
    this.addMouseListener(new TableRightClickHandler(this));
    this.updateTable();
}

//Attempts to add a new row to the table
//Returns APPEND_FAIL_DUPLICATE_CODE if the selected file is already in the table
//Returns APPEND_SUCCESS_CODE if the record is successfully added
public int addItem(Record newRecord) {
    TextConsole tc = ((TextConsole)this.parent.getConsole());
    if(this.itemInData(newRecord)) {
        tc.addText(
                "File " + newRecord.getFileName() + " already included.\n", TextConsole.redStyle
        );
        return this.APPEND_FAIL_DUPLICATE_CODE;
    }
    this.data.add(newRecord);
    tc.addText("File " + newRecord.getFileName() + " added successfully.\n", TextConsole.greenStyle);

    this.updateTable();


    return this.APPEND_SUCCESS_CODE;
}

//Updates the table to display any new data
public void updateTable() {

}

//Returns true if the record is already in the table
//Record equality is defined based on the full path to the file
public boolean itemInData(Record item) {
    for( Record r : data) {
        if(r.equals(item)) return true;
    }
    return false;
}

public JPopupMenu getItemRightClickMenu() {
    return itemRightClickMenu;
}

public JMenuItem getItemEdit() {
    return itemEdit;
}

public BaldGUI getParent() {
    return parent;
}
}

记录 type只是一个基本数据容器, RecordSet 只是 ArrayList {Record} 的扩展一种将其中的数据转换为 Object [] [] 的方法,用于 DefaultTableModel

The Record type is just a basic data container, and RecordSet is just an extension of ArrayList{Record} with a method to turn the data therein into an Object[][] for the DefaultTableModel.

推荐答案

所以,正如我所料,这是一个非常简单,愚蠢的错误。在我的RecordsTable类中,我将父GUI(BaldGUI)存储为名为parent的变量。然后我有一个方法getParent()来获取父节点,我没有意识到JTable带有一个方法getParent()来获取周围的组件。通过重写该方法,整个程序或多或少地破坏了。我改变了方法,它可以正常工作。

So, as I expected, it was a really simple, dumb mistake. In my RecordsTable class, I stored off the parent GUI (BaldGUI) as a variable called parent. I then had a method getParent() to fetch that parent, and I didn't realize that JTable comes with a method getParent() which gets the surrounding component. By overriding that method, the entire program more or less broke. I changed the method, and it works as it should.

这篇关于JScrollPane中的IntelliJ JTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆