无法在 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 无法详细查看)我发现了一些问题:
- 使用空布局是错误的。 Swing 旨在与布局管理器一起使用。
- 当您创建 Rubrica 框架时,您传递了对前一个框架的引用,为什么?一旦用户登录,就不需要引用该框架。相反,我会通过 "user"。然后你可以使用用户来做你的 SQL 查询。
- 不要扩展 JScrollPane!!!您没有向滚动窗格添加任何新功能。事实上,这可能是您的主要问题。您扩展了滚动窗格并创建了一个 JTable,但您从未将 JTable 添加到滚动窗格中。摆脱那个 class 并在 class.
的构造函数中创建 table 和滚动窗格
- 应在框架可见之前将 Swing 组件添加到框架。
我正在建立一个非常简单的通讯录。我正在尝试为每个用户的联系人列表实现一个带有复选框的 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 无法详细查看)我发现了一些问题:
- 使用空布局是错误的。 Swing 旨在与布局管理器一起使用。
- 当您创建 Rubrica 框架时,您传递了对前一个框架的引用,为什么?一旦用户登录,就不需要引用该框架。相反,我会通过 "user"。然后你可以使用用户来做你的 SQL 查询。
- 不要扩展 JScrollPane!!!您没有向滚动窗格添加任何新功能。事实上,这可能是您的主要问题。您扩展了滚动窗格并创建了一个 JTable,但您从未将 JTable 添加到滚动窗格中。摆脱那个 class 并在 class. 的构造函数中创建 table 和滚动窗格
- 应在框架可见之前将 Swing 组件添加到框架。