2014-11-15 13 views
0

Я искал много часов о том, как добавить данные связанного списка в Jtable, но ни один из результатов, которые я нашел, не удовлетворял. Я пытаюсь научить себя java, так что это немного сложно для меня. В любом случае, вот мой код. Я знаю, что это, наверное, очень плохо, поэтому, пожалуйста, будьте терпеливы со мной и помогите мне улучшить это.Как я могу показать свои двойные данные LinkedList в JTable?

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);    
    } 
} 
+1

Не рекомендуется использовать связанный список в таблице. Таблица нуждается в индексированном доступе к структуре данных. Вместо этого используйте ArrayList. Таким образом, вы можете напрямую получить доступ к элементу строки. –

ответ

2

Я определенно рекомендую вам использовать LinkedList класс из java.util пакета вместо реализации вашего собственного. Если вы используете LinkedList Java, тогда он будет иметь метод 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. Это позволит использовать вашу реализацию везде, где требуется список. Тогда вы будете programming to an interface, а не реализация.

+0

Все, что мне нужно сделать, это сделать объект для класса LinkedList внутри класса gui, и я могу сразу сохранить данные в списке, правильно? Извините, если я говорю глупо, и большое спасибо за ответ. –

+0

Это сработало бы, однако содержимое таблицы в идеале должно быть членом модели таблицы, а не компонентом GUI. Кроме того, комментарии/ответы, которые говорят об использовании ArrayList вместо LinkedList, верны. Поиск индексов по связанным спискам медленный, особенно для больших списков. – allTwentyQuestions

+0

в порядке и спасибо вам большое! –

0

Для доступа к элементу по индексу в связанном списке требуются операции O (n).

JTable нуждается в таком виде доступа.

A getValueAt для связанного списка будет выглядеть примерно так: начните с заголовка списка и перейдите к следующей записи k-1, затем верните полученное значение. Очевидно, что это не так быстро для больших наборов данных.

Другими словами: не использовать связанный список модель, но модель на базе массива, для таблиц.