如何在 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);            
    }
}

我绝对建议您使用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 次到下一个条目,然后返回结果值。显然,这对于大型数据集来说并不快。

换句话说:不要对表使用链表模型,而是使用基于数组的模型。

相关内容

  • 没有找到相关文章

最新更新