我一直在寻找如何将链表数据添加到 Jtable 上,但我发现的结果都不令人满意。我正在尝试自学Java,所以这对我来说有点困难。无论如何,这是我的代码。我知道这可能真的很糟糕,所以请耐心等待我,帮助我做得更好。
public class node {
public node next,pre;
public String name;
public double price;
public node (String n,double p){
this (n,p,null,null);
}
public node (String n,double p, node ne,node pr){
name = n;
price = p;
next = ne;
pre = pr;
}
}
public class list {
public node head, tail;
public list (){
head = tail = null;
}
public void addHead (String n,double p){
if (head != null){
head = new node (n,p,head, null);
head.next.pre = head;
}
else
head = tail = new node (n,p);
}
public int size (){
int size = 0;
for(node n = head; n.next != null; n = n.next)
size++;
return size;
}
public String print (){
String s = "";
if (head !=null){
for (node p = head; p !=null; p = p.next)
return p.name +"t"+ p.price;
}
return s;
}
}
我不知道在getValueAt方法中写什么
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
import javax.swing.table.*;
class gui extends JFrame implements ActionListener {
list li = new list ();
JButton ad;
JTextField t,t1;
JTextField t2;
JTable table = new JTable (new table_model());
public gui (){
setSize(500,500);
setTitle("DEMO");
setLocationRelativeTo(null);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(2,2));
t = new JTextField ("");
add(t);
t1 = new JTextField ("");
add(t1);
ad = new JButton ("add");
ad.addActionListener(this);
add(ad);
add(table);
}
public class table_model extends AbstractTableModel {
public list data;
String [] columns = {"Name","Price",
};
public void addList (list data){
this.data = data;
}
public int getColumnCount() {
return columns.length;
}
public int getRowCount() {
return data.size();
}
public String getColumnName(int col) {
return columns[col];
}
public Object getValueAt(int row, int col)
{
}
}
public void actionPerformed (ActionEvent e){
if (e.getSource() == ad && !t.equals("")){
li.addHead(t.getText(),Integer.parseInt(t1.getText()));
}
}
}
class test{
public static void main (String [] aed){
gui g = new gui();
g.setVisible (true);
}
}
我绝对建议您使用java.util
包中的 LinkedList 类,而不是实现自己的类。如果你使用Java的LinkedList,那么它将具有方法T get(int index)
它将返回指定索引处的元素。然后,您所要做的就是将对象属性映射到正确的列。
class MyObj {
public String name;
public double price;
}
class MyTableModel extends AbstractTableModel {
private List<MyObj> contents;
public MyTableModel(List<MyObj> contents){
this.contents = contents;
}
@Override
public int getRowCount(){
return this.contents.size();
}
@Override
public int getColumnCount(){
return 2;
}
@Override
public Object getValueAt(int row, int column){
MyObj myObj = contents.get(row);
//map column index to property
return (column == 0)? myObj.name : myObj.price;
}
}
这不需要专门使用链接列表。所有必需的方法都在列表接口中定义,LinkedList
类当然实现了该接口。如果必须使用自己的 LinkedList 实现,则还应实现 List 接口。这将允许在任何需要列表的地方使用您的实现。然后,您将对接口进行编程,而不是实现。
按链表中的索引访问元素需要 O(n) 操作。
JTable 需要这种访问。
链表的getValueAt
大致如下所示:从列表头部开始,前进 k-1
次到下一个条目,然后返回结果值。显然,这对于大型数据集来说并不快。
换句话说:不要对表使用链表模型,而是使用基于数组的模型。