【发布时间】: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)
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