我一直在寻找如何将链表数据添加到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);
}
}
答案 0 :(得分:2)
我绝对建议您使用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。所有必需的方法都在List Interface中定义,当然LinkedList
类实现了这些方法。如果必须使用自己的LinkedList实现,那么还应该实现List接口。这将允许您的实现在需要List的任何地方使用。那么你将是programming to an interface,而不是实现。
答案 1 :(得分:0)
在链接列表中按索引访问元素需要执行O(n)操作。
JTable需要这种访问。
链接列表的getValueAt
大致如此:从列表头开始,将k-1
次提前到下一个条目,然后返回结果值。显然,对于大型数据集来说,这并不快。
换句话说:不使用链表模型,但基于数组的模型适用于表。