2013-09-21 5 views
2

Как отображать объекты «Click» в JTable?Создать JTable из ArrayList объектов - Java

ArrayList<Click> myClicks = new ArrayList<Click>(); 

Click click = new Click(620, 1028); 
Click click2 = new Click(480, 230); 

myClicks.add(click); 
myClicks.add(click2); 

Это должно выглядеть примерно так:

|---Mouse X---|---Mouse Y---| 
|  620  |  1028 | 
|  480  |  230 | 

Что действительно ...

 |    | 
     v    v 
    click.getX() click.getY() 
    click2.getX() click2.getY() 

Я не хочу использовать 2D объект [] [], потому что имеет смысл хранить их как объекты Click как можно дольше.

Я знаю, что, вероятно, мне нужно расширить интерфейс TableModel, но я не уверен, как это сделать.

Мне бы очень понравился быстрый и простой пример (java docs немного запутывают).

+0

Что конкретно о документах Java сбивает с толку? Возможно, мы сможем просветить вас. –

+0

@JoshM Я проводил чашу часов, документы хороши для действительно простых приложений. Он не объясняет, как связать таблицу с массивом списка сложных объектов. Сейчас я становлюсь просветленным. – Ant

ответ

7

Вы можете использовать DefaultTableModel, но в вашем случае, это будет означать, что вам нужно преобразовать данные, чтобы подтвердить это потребности, лучше определить модель, которая поддерживает модель вы данных ... это своего рода точка

В следующих примерах используется AbstractTableModel, поскольку он дает вам контроль над данными резервного копирования, но заботится о большинстве домашних работ (регистрации и запусках).

Пример не изменен. То есть вы не можете добавлять или удалять новые клики или изменять существующие клики. Это не трудно сделать, и вы должны прочитать How to use tables для более подробной информации

enter image description here

import java.awt.EventQueue; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 

public class ClickTable { 

    public static void main(String[] args) { 
     new ClickTable(); 
    } 

    public ClickTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       List<Click> clicks = new ArrayList<>(25); 
       clicks.add(new Click(620, 1028)); 
       clicks.add(new Click(480, 230)); 
       ClickTableModel model = new ClickTableModel(clicks); 
       JTable table = new JTable(model); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class Click { 

     private int x; 
     private int y; 

     public Click(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     public int getX() { 
      return x; 
     } 

     public int getY() { 
      return y; 
     } 

    } 

    public class ClickTableModel extends AbstractTableModel { 

     private List<Click> clicks; 

     public ClickTableModel(List<Click> clicks) { 
      this.clicks = new ArrayList<>(clicks); 
     } 

     @Override 
     public int getRowCount() { 
      return clicks.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public String getColumnName(int column) { 
      String name = "??"; 
      switch (column) { 
       case 0: 
        name = "Mouse X"; 
        break; 
       case 1: 
        name = "Mouse Y"; 
        break; 
      } 
      return name; 
     } 

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      Class type = String.class; 
      switch (columnIndex) { 
       case 0: 
       case 1: 
        type = Integer.class; 
        break; 
      } 
      return type; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      Click click = clicks.get(rowIndex); 
      Object value = null; 
      switch (columnIndex) { 
       case 0: 
        value = click.getX(); 
        break; 
       case 1: 
        value = click.getY(); 
        break; 
      } 
      return value; 
     }    
    }   
} 
1

имеет больше смысла, чтобы держать их в качестве объектов Нажмите как можно дольше.

И, вероятно, будут другие случаи, когда вы хотите отображать другие пользовательские объекты в таблице. Row Table Model предоставляет общую поддержку для ArrayList объектов. Он обеспечивает поддержку динамических функций, таких как добавление и удаление.

JButtonTableModel.java дает и пример кода, необходимого для реализации полной модели объекта.

Смежные вопросы