【问题标题】:Cannot build, or show, a Swing JTable with checkboxes inside a JScrollPane无法在 JScrollPane 内构建或显示带有复选框的 Swing JTable
【发布时间】:2019-11-21 10:25:03
【问题描述】:

我正在建立一个非常简单的通讯录。我正在尝试为每个用户的联系人列表实现一个带有复选框的表格。我基于此:https://stackoverflow.com/a/7392163/6528351。我已经编辑了一些代码,选择 (UserContactTablePane) 来扩展 JScrollPane 并将其用作表格的容器 [EDIT 2: code edited to fit a hard code version]:

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

我不知道我错过了什么。未创建包含表格的滚动窗格(显示)。

我可以请你帮忙吗?谢谢。

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

【问题讨论】:

  • 1) panel.setLayout(null); Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) “我不知道我错过了什么。”minimal reproducible example,对于初学者来说。
  • 我已经链接了框架的图像。如果是面板布局的问题,不应该创建一个带有随意放置的组件的框架吗?相反,我设置了一定的界限,视图是这样的。带边框的滚动窗格出现,但其内容(表格)没有出现。
  • 不要将scrollingContactsPanel的布局设置为null,不要将其布局设置为任何东西。此外,为您正在做的事情扩展 JScrollPane 是一个坏主意。此外,Andrew Thompson 所说的很中肯:粘贴您的一些代码片段对我们帮助您解决问题并没有多大帮助。相反,创建一个小程序来显示您遇到的问题,并在一个类中完成所有操作(包括您的 main 方法)。这使我们能够复制/粘贴您的程序,快速对其进行测试,并可能为您提供更正的程序或指示如何解决您的问题。
  • 以下链接详细解释了我们所说的“一个展示问题的类中的小程序”的含义:如何创建Short, Self Contained, Correct (Compilable), Example(SSCCE)。一旦您创建了这样的 SSCCE,edit 您的问题,请删除代码片段并添加您的 SSCCE。祝你好运!
  • 这是一个指南而不是规则。该指南类似于minimal reproducible example,但措辞更明确。重点是一样的。让周围的人能够帮助你,这是最实用的,也最有可能得到答案或帮助。不客气。

标签: java swing jtable jscrollpane jcheckbox


【解决方案1】:

我不知道现在必须复制粘贴所有可执行代码。

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

在任何情况下,您都不会被要求发布所有可执行代码。您被要求发布完全不同的 MRE。 MRE 的目的是让您通过简化代码来确保您理解所提出的问题。

您的问题是How to I add a JTable to a JFrame。您发布的 90% 的代码与该问题完全无关。数据来自哪里并不重要。那就是数据可以被硬编码,这意味着 SQL 逻辑与你所说的问题完全无关。

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

JTable table = new JTable(10, 50);

所以首先要弄清楚如何将该表格添加到您的框架中。然后,您会担心从数据库中的数据创建 TableModel。在跑步之前先学会走路。调试 10 行代码比 100 行更容易。所以你的首要任务是简化问题。

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

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

【讨论】:

  • 亲爱的你好。我后来了解了MRE,当然! “您发布的 90% 的代码与该问题完全无关”-> 如果目的是提供 SSCCE,我将不得不放置所有必要的代码,这是最小的。 “也就是说,数据可以被硬编码,这意味着 SQL 逻辑与你所说的问题完全无关。” -> 当然!就像我最初发布我的问题一样,在我最后一次编辑之前。关于您的其余答案,我将遵循它,谢谢:) :)
  • 我被要求提供一个 sscce,如果你没有注意到 :)
  • 我被要求提供一个 sscce, - 你首先被要求发布一个 minimal reproducible example (MRE),然后你被要求发布一个 SSCCE,然后你又是要求发布MRE
  • 知道了。我发现它们并不难理解。谢谢,安德鲁。 “如果您不理解任一文档的任何部分,现在是提出问题的好时机/地点。这里的很多人都可以回答它们” -> 我猜在 MetaSO 上(?)
  • @tom 不要忘记点击复选标记“接受”答案,这样人们就知道问题已经解决了。
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多