簡體   English   中英

JScrollPane中的IntelliJ JTable

[英]IntelliJ JTable in JScrollPane

我正在使用IntelliJ GUI Builder為我的應用程序設計GUI。 在其中, JScrollPane內部有一個JTable似乎不起作用。 首先,我無法顯示列標題。 其次,無法單擊表。 無論是在默認行選擇中還是在我實現的任何MouseListeners ,都好像我要從實際位置單擊3行一樣。 最后,如果表超過了JScrollPane的大小,它將僅忽略最后的X行,並且不提供滾動條來查看它們。

我現在已經對該項目進行了幾次重做,嘗試了AbstractTableModelDefaultTableModel擴展,最近我嘗試完全放棄自定義TableModel並且僅使用DefaultTableModel構造函數無效。 這是所有相關的代碼(其中一些是由GUI Builder自動生成的,我無法直接對其進行修改)。

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

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;
}
}

Record類型只是一個基本的數據容器,而RecordSet只是ArrayList{Record}的擴展,它具有一種將其中的數據轉換為DefaultTableModelObject[][]的方法。

因此,正如我所料,這是一個非常簡單的愚蠢錯誤。 在我的RecordsTable類中,我將父GUI(BaldGUI)存儲為一個名為parent的變量。 然后,我有一個方法getParent()來獲取該父對象,但我沒有意識到JTable帶有一個方法getParent()來獲取周圍的組件。 通過覆蓋該方法,整個程序或多或少地崩潰了。 我更改了方法,它可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM