我是使用Jtable的新手,我需要一些帮助。我想编写以下CODE来显示表中队列的数据
问题:数据没有出现在表格中
我不知道有什么问题!!
我需要帮助,请
源代码:
//班级学生
public class student {
int id,age;
String fn,ln;
public student(int id,String fn,String ln,int age){
this.age = age;
this.id = id;
this.fn = fn;
this.ln = ln;
}
}
// class node
public class node {
student info;
node link;
public node(student st,node next){
this.info = info;
this.link = link;
}
}
// class queue
import javax.swing.*;
public class Queue{
node front ,rear;
int length;
public void enqueue( student x){
node newnode=new node(x,null);
if(front==null)
front=rear=newnode;
else{
rear.link=newnode;
rear=newnode;
}length++;
}
public student dequeue(){
student temp=front.info;
if(front==null && rear==null){
throw new RuntimeException("empty");
}else{
front=front.link;
if(front==null)
rear=null;
length--;
}return temp;
}
public String[][] getData(){
Queue x= new Queue();
x.front= front;
x.rear = rear;
String s[][] = new String[x.length][4];
if(x.front==null){
JOptionPane.showMessageDialog(null,"the Queue is empty,you must add new student befor");
}else{
student tmp;
for(int i=0;i<x.length;i++){
try{
tmp = x.dequeue();
s[i][0] = tmp.id + " ";
s[i][1] = tmp.fn;
s[i][2] = tmp.ln;
s[i][3] = tmp.age + " ";
}catch(Exception e){
System.out.println("Exception from getData");
}
}
}
return s;
}
}
//课程
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class program extends JFrame implements ActionListener{
Container c;
JTextField txtID,txtFN,txtLN,txtAge;
JLabel lblTitle,lblID,lblFN,lblLN,lblAge;
JButton btnAdd,btnUpdate,btnDelet,btnPrint,btnSort,btnRefresh,btnCancel;
JTable table;
String data[][];
Queue q;
public program(){
c = getContentPane();
setTitle(" Student Applicaion ");
c.setLayout(null);
q = new Queue();
// add lbl
lblTitle = new JLabel("ADD NEW STUDENT");
lblTitle.setFont(new Font ("Helvetica", Font.PLAIN, 20));
lblTitle.setBounds(50,20,200,20);
c.add(lblTitle);
lblID = new JLabel("ID");
lblID.setBounds(50,50,70,20);
c.add(lblID);
lblFN = new JLabel("First Name");
lblFN.setBounds(50,80,70,20);
c.add(lblFN);
lblLN = new JLabel("Last Name");
lblLN.setBounds(50,110,70,20);
c.add(lblLN);
lblAge = new JLabel("Age");
lblAge.setBounds(50,140,70,20);
c.add(lblAge);
// add txt
txtID = new JTextField();
txtID.setBounds(130,50,120,20);
c.add(txtID);
txtFN = new JTextField();
txtFN.setBounds(130,80,120,20);
c.add(txtFN);
txtLN = new JTextField();
txtLN.setBounds(130,110,120,20);
c.add(txtLN);
txtAge = new JTextField();
txtAge.setBounds(130,140,120,20);
c.add(txtAge);
// add btn
btnAdd = new JButton("Add");
btnAdd.setBounds(90,180,70,25);
c.add(btnAdd);
btnRefresh = new JButton("Refresh");
btnRefresh.setBounds(165,180,80,25);
c.add(btnRefresh);
btnUpdate = new JButton("Update");
btnUpdate.setBounds(300,50,100,20);
c.add(btnUpdate);
btnDelet = new JButton("Delet");
btnDelet.setBounds(300,80,100,20);
c.add(btnDelet);
btnPrint = new JButton("Print");
btnPrint.setBounds(300,110,100,20);
c.add(btnPrint);
btnSort = new JButton("Sort");
btnSort.setBounds(300,140,100,20);
c.add(btnSort);
btnCancel= new JButton("Cancel");
btnCancel.setBounds(355,435,80,25);
c.add(btnCancel);
// add table
// print();
btnAdd.addActionListener(this);
btnUpdate.addActionListener(this);
btnDelet.addActionListener(this);
btnPrint.addActionListener(this);
btnSort.addActionListener(this);
btnRefresh.addActionListener(this);
btnCancel.addActionListener(this);
setSize(450, 500);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == btnCancel)
System.exit(0);
else if(e.getSource() == btnRefresh){
txtAge.setText("");
txtFN.setText("");
txtID.setText("");
txtLN.setText("");
}
else if(e.getSource() == btnAdd){
if(isThreeDigit(txtID.getText().trim()) == false || isNumber(txtID.getText().trim()) == false)
JOptionPane.showMessageDialog(null,"you entered invalid ID");
else if(isCapital(txtFN.getText().trim()) == false)
JOptionPane.showMessageDialog(null,"you must begin First name with capital Character");
else if(!isString(txtFN.getText().trim()) || !(isString(txtLN.getText().trim())))
JOptionPane.showMessageDialog(null,"You can't enter number on your name");
else if(checkAge(txtAge.getText().trim()) == false)
JOptionPane.showMessageDialog(null,"You must enter real age in numbers format");
else{
student st = new student(Integer.parseInt(txtID.getText().trim()),txtFN.getText(),
txtLN.getText(),Integer.parseInt(txtAge.getText().trim()));
q.enqueue(st);
// print();
}
}
else if(e.getSource() == btnPrint){
print();
}
}
public void print(){
String col[] = {"ID","FName","LName","Age"};
data = q.getData();
table = new JTable(data,col);
// table.editingStopped(ChangeEvent e) ;
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(10,230,420,200);
c.add(scrollPane);
}
//~~~~~~~~~~~~ Constraints
public boolean isThreeDigit(String id){
if(id.length() <= 3)
return true;
return false;
}
public boolean checkAge(String age){
if(!isNumber(age) || Integer.parseInt(age) > 90 || Integer.parseInt(age) < 6 )
return false;
return true;
}
public boolean isNumber(String id){
for(int i=0;i<id.length();i++){
char c=id.charAt(i);
if(c>'9'|| c<'0')
return false;
}
return true;
}
public boolean isString(String id){
for(int i=0;i<id.length();i++){
char c=id.charAt(i);
if(c<='9'|| c<='0')
return false;
}
return true;
}
public boolean isCapital(String FN){
char c=FN.charAt(0);
if(c>='A'&& c<='Z')
return true;
return false;
}
public static void main (String[] args) {
new program();
}
}
答案 0 :(得分:3)
两件事:
请使用大写字母开始您的班级名称
自定义TableModel可能是个好主意。而不是从头开始实现TableModel,而是扩展AbstractTableModel,因为它处理所有事件和监听器方面,并将为您节省大量时间。
答案 1 :(得分:1)
你的班级队列应该实现TableModel。然后用:
创建表格Queue q= new Queue();
JTable table= new JTable(q);
答案 2 :(得分:0)
我发现至少有一个错误,不确定是否只有一个错误:
public class node {
student info;
node link;
public node(student st,node next){
this.info = info;
this.link = link;
}
}
this.info = info;
什么都不做,试试这个:
public class node {
student info;
node link;
public node(student st,node next){
this.info = st;
this.link = next;
}
}
有些单元测试可以很好地捕捉到这个......或者只是使用Java中的集合......
编辑:
第二,在getData:
public String[][] getData(){
Queue x= new Queue();
x.front= front;
x.rear = rear;
String s[][] = new String[x.length][4];
...
student tmp;
for(int i=0;i<x.length;i++){
try{
tmp = x.dequeue();
你这里没有做x的真实副本:
- x.length
仍为零
- 您仍在使用原始节点,而不是副本。如果您x.dequeue()
原始节点发生了变化
- x.dequeue
更改x.length
,以便您的循环中途停止
最好导航队列:
public String[][] getData(){
String s[][] = new String[length][4];
if (front == null) {
JOptionPane.showMessageDialog(null,"the Queue is empty,you must add new student befor");
} else {
int i = 0;
// node node = front; // that's why class name should be uppercase!!
node aNode = front;
while (aNode != null) { // for would also do...
student tmp = aNode.info;
s[i][0] = String.valueOf(tmp.id); // + " ";
s[i][1] = tmp.fn;
s[i][2] = tmp.ln;
s[i][3] = String.valueOf(tmp.age); // + "";
i += 1;
aNode = aNode.link;
}
}
return s;
}
EDIT2:
这样,只有在按下按钮时才会更新表格。
使用TableModel,在其他答案中消化,以便在每次更改队列时更新它
我也不喜欢每次更新数据时创建新JTable和JScrollPane的想法......我更喜欢用一个JTable实例创建GUI,只需在需要时更新该实例的模型。 (TableModel会为你做这件事)。