无法在 JScrollPane 中构建或显示带有复选框的 Swing JTable

Cannot build, or show, a Swing JTable with checkboxes inside a JScrollPane

我正在建立一个非常简单的通讯录。我正在尝试为每个用户的联系人列表实现一个带有复选框的 table。我基于此:。我编辑了一些代码,选择 (UserContactTablePane) 扩展 JScrollPane 并将其用作 table [EDIT 2 的容器:编辑代码以适应硬代码版本]:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

public class RubricaMain {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    RubricaGui frame = new RubricaGui();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

class RubricaGui extends JFrame implements ActionListener {

    public RubricaGui() throws IOException {
        this.setResizable(false);
        setTitle("Contact book");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setShowRubricaFrame(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }


    private void setShowRubricaFrame(JFrame main) {

        main.setBounds(250, 100, 1000, 355);

        JPanel panel = new JPanel();
        panel.setLayout(null);

        main.setContentPane(panel);
        main.setVisible(true);

        Object[] columnNames = {"", "Name", "Surname", "Telephone number", ""};
        Object[][] dataTable = {
                {"1","Harry","Kane","+44 333333",false},
                {"2","David","Bechkam","+44 444444",false},
                {"3","Steven","Gerrard","+44 555555",false}
        };

        JScrollPane scrollingContactsPanel = new UserContactTablePane(columnNames, dataTable);
        scrollingContactsPanel.setBorder(new      TitledBorder(UIManager.getBorder("TitledBorder.border"), "Contact book", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
        scrollingContactsPanel.setBounds(10, 50, 975, 260);
        panel.add(scrollingContactsPanel);

    }

}


class UserContactTablePane extends JScrollPane {

    private JTable table;

    public UserContactTablePane(Object[] columnNames, Object[][] data) {

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model) {

            @Override
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return String.class;
                    case 1:
                        return String.class;
                    case 2:
                        return String.class;
                    case 3:
                        return String.class;
                    default:
                        return Boolean.class;
                }
            }
        };

        table.setPreferredScrollableViewportSize(table.getPreferredSize());
    }

}

我无法创建和展示它。

方法setShowRubricaFrame设置了主框架,里面显示了一个用户的电话号码列表,我作为一个Object[][]传递给UserContactTablePane的列表。

我不知道我错过了什么。带有 table 的滚动窗格未创建(显示)。

可以请你帮忙吗?谢谢。

编辑 1 - 滚动窗格 "Rubrica" 应该显示我的列表,但它没有:

I didnt know that now it is mandatory to copy-paste all executable code.

如果您努力提出一个清楚的问题,我们将努力给出一个好的答案

在任何情况下,您都没有被要求 post 所有的 executable 代码。你被要求 post 一个完全不同的 MRE。 MRE 的目的是让你通过简化代码来确保你理解你所问的问题。

您的问题是How to I add a JTable to a JFrame。您 post 编辑的 90% 的代码与该问题完全无关。数据来自哪里并不重要。那就是可以对数据进行硬编码,这意味着 SQL 逻辑与您陈述的问题完全无关。

只需一行代码即可创建一个 JTable:

JTable table = new JTable(10, 50);

所以想办法先把 table 添加到你的框架中。稍后您会担心从数据库中的数据创建 TableModel。先学会走路 运行。调试 10 行代码比调试 100 行代码更容易。因此,您的首要任务是简化问题。

快速浏览一下代码(代码太多 post 无法详细查看)我发现了一些问题:

  1. 使用空布局是错误的。 Swing 旨在与布局管理器一起使用。
  2. 当您创建 Rubrica 框架时,您传递了对前一个框架的引用,为什么?一旦用户登录,就不需要引用该框架。相反,我会通过 "user"。然后你可以使用用户来做你的 SQL 查询。
  3. 不要扩展 JScrollPane!!!您没有向滚动窗格添加任何新功能。事实上,这可能是您的主要问题。您扩展了滚动窗格并创建了一个 JTable,但您从未将 JTable 添加到滚动窗格中。摆脱那个 class 并在 class.
  4. 的构造函数中创建 table 和滚动窗格
  5. 应在框架可见之前将 Swing 组件添加到框架。