繁体   English   中英

如何在JTable中显示我的双重LinkedList数据?

[英]How Can I Show My Doubly LinkedList Data in a 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。 所有必需的方法都在List接口中定义,该接口当然是LinkedList类所实现的。 如果必须使用自己的LinkedList实现,则还应该实现List接口。 这将使您的实现可在需要列表的任何地方使用。 然后,您将编程到一个接口 ,而不是一个实现。

通过链表中的索引访问元素需要O(n)操作。

JTable需要这种访问。

链表的getValueAt大致如下:从表头开始,前进k-1次到下一个条目,然后返回结果值。 显然,这对于大型数据集来说并不快。

换句话说: 不要使用链接的列表模式 ,而是基于阵列的模型,对

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM