- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在创建,或者更多地尝试为我的项目创建 GUI。我现在需要做的是创建一个从 LinkedList 读取数据的 JTable。我为此有一个自定义的 TableAbstractModel 。
public class StudentTableModel extends AbstractTableModel {
public static final String[] columnNames = { "ID", "First Name",
"Last Name" };
private LinkedList<Student> data;
public StudentTableModel(LinkedList<Student> data) {
this.data = data;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Student student = data.get(rowIndex);
if (student == null) {
return null;
}
switch (columnIndex) {
case 0:
return student.getID();
case 1:
return student.getFirstname();
case 2:
return student.getLastname();
default:
return null;
}
}
}
现在我试图构建一个非常基本的布局,仅包含表格以及适当的 JTextfields 和 JButtons 来测试表格是否实际工作。
public class GUI extends JFrame {
private JTextField StudentID;
private JTextField Firstname;
private JTextField Lastname;
private JTextField Group;
private JButton Add;
private static Database DB; // << Does this have to be static? Eclipse tells me it needs to be, but I am not sure.
private JTable StudentTable;
public GUI(Database DB) {
super("Theatre Management");
setExtendedState(JFrame.MAXIMIZED_BOTH);
this.DB = DB;
LinkedList<Student> data = null;
setLayout(new FlowLayout());
StudentID = new JTextField("Enter Student ID", 10);
Firstname = new JTextField("Enter First Name");
Lastname = new JTextField("Enter Last Name");
Group = new JTextField("Enter Group ID");
Add = new JButton("Add Student");
StudentTable = new JTable();
StudentTable.setModel(new StudentTableModel(data));
JScrollPane scrollPane = new JScrollPane(StudentTable);
StudentTable.setFillsViewportHeight(true);
add(StudentTable);
add(StudentID);
add(Firstname);
add(Lastname);
add(Group);
add(Add);
add(scrollPane);
addStudentEvent add = new addStudentEvent();
Add.addActionListener(add);
}
public static void createAndShow() {
GUI Database = new GUI(DB);
Database.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
Database.setVisible(true);
}
public static void main(String[] args) {
GUI.createAndShow();
}
private class addStudentEvent implements ActionListener {
public void actionPerformed(ActionEvent event) {
int G = Integer.parseInt(Group.getText());
int ID = Integer.parseInt(StudentID.getText());
String First = Firstname.getText();
String Last = Lastname.getText();
DB.getGroup(G).addStudent(ID, First, Last);
DB.addStudent(ID, First, Last);
}
}
}
现在的问题是,当我尝试运行 GUI 时,我就会收到一大堆错误。
Exception in thread "main" java.lang.NullPointerException
at theatremanagement.StudentTableModel.getRowCount(StudentTableModel.java:29)
at javax.swing.JTable.getRowCount(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.createTableSize(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at java.awt.FlowLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at java.awt.Container.validateUnconditionally(Unknown Source)
at java.awt.Window.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at theatremanagement.GUI.createAndShow(GUI.java:59)
at theatremanagement.GUI.main(GUI.java:64)
我现在真的陷入困境,不知道如何解决这个问题。如果有人能告诉我我做错了什么,那就太好了。另一方面,我必须在我的程序中的不同类中使用 LinkedList。 TableModel 如何知道我想要哪一个?我是否需要向 TableModel 添加任何内容,以使表在添加或删除学生后自动更新?
更新:
private JTable setStudentList(LinkedList<Student> Studentlist) {
JTable StudentTable = new JTable();
StudentTable.setModel(new StudentTableModel(Studentlist));
JScrollPane scrollPane = new JScrollPane(StudentTable);
StudentTable.setFillsViewportHeight(true);
return StudentTable;
这个方法可以创建带有链表的表吗?然后我会调用该方法吗
setStudentList(Studentlist);
如果我这样初始化一个空的 LinkedList:
LinkedList<Student> StudentList = new LinkedList<Student>();
感谢您的帮助。
最佳答案
LinkedList
永远不会初始化...
LinkedList<Student> data = null;
// ... ///
StudentTable.setModel(new StudentTableModel(data));
这意味着当调用 getRowCount
时,data
对象为 null
,因此会出现 NullPointerException
已更新
您可以使用任意数量的选项来将对主 LinkedList
的引用传递到 UI,但这取决于您的工作流程的工作方式。
你可以...
通过 UI 的构造函数传递对 UI 的引用...
public GUI(Database DB, LinkedList<Student> students) {...}
你可以...
通过 GUI
类中的方法传递 LinkedList
...
public class GUI extends JFrame {
//...//
public GUI(Database DB) {...}
public void setStudent(LinkedList<Student> students) {
StudentTable.setModel(new StudentTableModel(students));
}
}
已更新示例
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
public class PassTable {
public static void main(String[] args) {
new PassTable();
}
public PassTable() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private ExampleTable example;
public TestPane() {
setLayout(new BorderLayout());
example = new ExampleTable();
add(example);
JButton add = new JButton("Add");
add(add, BorderLayout.SOUTH);
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LinkedList<Person> people = new LinkedList<Person>();
people.add(new Person("A", "A", 1));
people.add(new Person("B", "B", 2));
people.add(new Person("C", "C", 3));
people.add(new Person("D", "D", 4));
example.setPeople(people);
}
});
}
}
public class ExampleTable extends JPanel {
private JTable table;
public ExampleTable() {
this(new LinkedList<Person>());
}
public ExampleTable(LinkedList<Person> people) {
setLayout(new BorderLayout());
table = new JTable(new SampleTableModel(people));
add(new JScrollPane(table));
}
public void setPeople(LinkedList<Person> people) {
table.setModel(new SampleTableModel(people));
}
}
public class SampleTableModel extends AbstractTableModel {
private LinkedList<Person> data;
public SampleTableModel(LinkedList<Person> data) {
this.data = data;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public String getColumnName(int column) {
String name = "";
switch (column) {
case 0:
name = "First name";
break;
case 1:
name = "Last name";
break;
case 2:
name = "Age";
break;
}
return name;
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
Person person = data.get(rowIndex);
switch (columnIndex) {
case 0:
value = person.getFirstName();
break;
case 1:
value = person.getLastName();
break;
case 2:
value = person.getAge();
break;
}
return value;
}
}
public class Person {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public int getAge() {
return age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
}
关于java - GUI 不适用于自定义 AbstractTableModel。错误 "Unknown Source",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15919840/
我有一个无 GUI 的服务器(没有任何桌面环境或 Ubuntu 服务器的新鲜 Debian,没有 X 服务器,先验)。 我考虑安装 docker 并拉取一个基于官方 Ubuntu 的容器,并在其上添加
我正在构建一个带有临时用户名系统的简单聊天服务器。当屏幕弹出时,首先会出现一个简单的屏幕,询问您的用户名。你可以放入任何你想要的东西,这纯粹是暂时的(我也在尝试)。代码告诉程序继续,将用户名保存到代码
我想将来自其他类的图像显示到 QLabel 中,但要通知 GUI 有一个新的框架可用。我需要从非 GUI 类和非 GUI 线程发出信号。 有什么办法吗? 最佳答案 signal 可以从任何继承QObj
我正在用 Java 编写一个图形用户界面,它有一些按钮,其中一个按钮是选项。我想要它,所以当您单击选项时,它会将 gui 更改为我的选项 gui,而不是在另一个窗口中打开它。 我该怎么做? 最佳答案
标题说明了一切...我和我的 friend 正在这样做,我们不知道为什么 Ball.java 实际上没有在 gamePanel 中制作球,然后制作 GUI。顺便说一句,这是 8 球台球。这是代码: 驱
我正在使用 GUI 构建器,我想知道是否有一种简单的方法可以通过当前主窗口打开寄存器窗口(引用下面的页面)。我正在尝试通过菜单栏来执行此操作。 我一整天都在尝试,因为 GUI Builder 生成了一
我有一个程序使用了许多隐藏的 GUI 组件。例如,所有菜单项和打印机对话框/组件(仅占用至少 50 毫秒)。总的来说,我猜整个程序启动的大约 300 毫秒(或 40%)要归功于所有隐藏的东西。 我想做
我对 GUI 构建比较陌生。 我想制作一个带有按钮(我已经有了)的 GUI,用户可以按下该按钮并选择一个图像,然后动态地将该图像加载到面板中的 GUI 中。我希望每次用户浏览图像时图像都动态变化。 到
我有两年使用 Java 和 Visual Studio 进行企业应用程序编程的经验,而且我是 Python 和 wxPython 的新手。所以我的问题是:wxPython 能否为我提供足够丰富的 GU
这是我启动 mkvtoolnix-gui 时遇到的错误: mkvtoolnix-gui: symbol lookup error: mkvtoolnix-gui: undefined symbol:
我在初始屏幕上有一些最近使用的存储库,我想删除它们,因为我不再使用它们了。如何删除它们? 操作系统 = Windows 7 我查看了注册表并搜索了 git 目录,但找不到最近使用列表的存储位置。 最佳
我正在尝试在 matlab、GUI 中用户输入点作为输入和它们之间的连接。 我有 5 个 matlab 文件 - screen1.m、screen2.m、screen3.m、screen4.m、glo
我用java制作了一个客户端/服务器程序,我已经按照我想要的方式使用cmd完美地工作了,现在我正在尝试将代码的客户端转换为GUI,但是我在打印时遇到问题客户端消息并从文本字段和服务器消息读取客户端输入
我正在制作一种 CRUD 应用程序(Java GUI,MYSQL)我应该: 将数据从数据库加载到List(例如),然后将List加载到GUI 将数据从数据库加载到对象(具有 SQL 表等属性)和对象到
我正在开发一个有 5 个图形用户界面窗口的 Java 应用程序,其中一个是问候窗口或主窗口,我已经完成了所有逻辑部分的工作,我已经完成了 99.99%,唯一剩下的就是我如何以这种方式编码,当我点击一个
我目前正在开发 GUI。 我选择将我的 GUI 基于 bluej 项目 - Scribble。 当您创建 ScribbleGUI 对象时,DrawDemo 类会创建一个同时自动打开的 Canvas 。
在这里阅读了很多关于多进程、管道等的内容后,我还没有找到答案,但如果它已经存在,我深表歉意。 我有一个外围硬件,我正在尝试为其创建一个 GUI。我想让 GUI 使用来自外围设备的数据不断更新,同时仍保
我想做的是将 GUI 从一个单独文件中的类链接到另一个类。我的第一个类是一个主菜单,它将显示一些链接到另一个窗口的按钮。第二个类显示不同的窗口,但我现在遇到的问题是我不知道如何链接第一个类中的按钮来调
我的 GUI 代码中有一个奇怪的行为。如果用户在短时间内产生大量事件,则可能会发生正在运行的事件处理程序方法被另一个事件处理程序方法中断。由于一切都在同一个线程(GUI 线程)中运行,所以一切都应该按
这是一个涉及风格的问题。我正在寻找可以帮助我解决常见 GUI 设计问题 的想法。该应用程序是在 Winforms 中完成的,宁愿使用 WPF,该应用程序已经完成,但我是一个完美主义者,在与其他人合作时
我是一名优秀的程序员,十分优秀!