如何在JTable中显示我的双向链表数据?

时间:2014-11-15 17:20:27

标签: java swing linked-list jtable

我一直在寻找如何将链表数据添加到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);            
    }
}

2 个答案:

答案 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次提前到下一个条目,然后返回结果值。显然,对于大型数据集来说,这并不快。

换句话说:不使用链表模型,但基于数组的模型适用于