2012-04-12 3 views
-1

У меня есть GUI, в котором есть контейнер для JTable, называемый «listTable». Я хочу заполнить JTable данными, хранящимися в связанном списке, с помощью AbstractTableModel.Java - Добавление данных из JTable из AbstractTableModel с использованием LinkedLists

В принципе, у меня есть LinkedList, хранящийся в Processing.java. Он содержит все данные, полученные из текстового файла. Я создал AbstractTableModel, чтобы сообщить JTable, как быть заполненным. Теперь я хочу заполнить JTable в GUI_g «содержимым связанного списка».

Любой может сказать мне, как это сделать?

Вот код:

GUI_g:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.JTable; 


public class GUI_g extends JFrame { 

    public void buildGui() { 

     JFrame frame = new JFrame("Hotel TV Scheduler"); 

       JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout(0,0)); 

       JPanel chPanel = new JPanel(); 
       chPanel.setLayout(new GridLayout(3,1)); 

       JPanel listPanel = new JPanel(); 
       listPanel.setLayout(new GridLayout(3,2,1,0)); 

       JPanel infoPanel = new JPanel(); 
     infoPanel.setLayout(new GridLayout(0,3, 1, 0)); 


       JPanel addPanel = new JPanel(); 
     addPanel.setLayout(new GridLayout(0,3)); 

       JPanel chlblPanel = new JPanel(); 
       chlblPanel.setLayout(new GridLayout(1,2)); 

       JPanel tablePanel = new JPanel(); 
       tablePanel.setLayout(new GridLayout(1,2)); 

       JPanel rmvbtnPanel = new JPanel(); 
       rmvbtnPanel.setLayout(new GridLayout(1,2)); 

       JPanel centrePanel = new JPanel(); 
       centrePanel.setLayout(new GridLayout(0,3)); 


      // mainPanel.add(chPanel, BorderLayout.WEST); 
      // mainPanel.add(listPanel, BorderLayout.EAST); 
       mainPanel.add(centrePanel, BorderLayout.CENTER); 


       JTable chOneTable = new JTable(); 
       JTable chTwoTable = new JTable(); 

       JTable listTable = new JTable(new ProgramTableMode()); 

       JLabel ch1Label = new JLabel("Channel 1"); 
       JLabel ch2Label = new JLabel("Channel 2"); 
       JLabel listLabel = new JLabel("List"); 

       JButton rmvChOneButton = new JButton("Remove Channel"); 
       JButton rmvChTwoButton = new JButton("Remove Channel"); 

       chlblPanel.add(ch1Label); 
       chlblPanel.add(ch2Label); 

       tablePanel.add(chOneTable); 
       tablePanel.add(chTwoTable); 

       rmvbtnPanel.add(rmvChOneButton); 
       rmvbtnPanel.add(rmvChTwoButton);    

       chPanel.add(chlblPanel); 
       chPanel.add(tablePanel); 
       chPanel.add(rmvbtnPanel); 

       listPanel.add(listLabel); 
       listPanel.add(listTable);     

       JLabel titleLabel = new JLabel("Title"); 
       JLabel genreLabel = new JLabel("Genre"); 
       JLabel durationLabel = new JLabel("Duration"); 
       JLabel actorLabel = new JLabel("Actor"); 
       JLabel directorLabel = new JLabel("Director"); 
       JLabel rentableLabel = new JLabel("Rentable"); 
       JLabel synLabel = new JLabel("Synopsis"); 

       JTextField txtTitle = new JTextField();   
       JTextField txtGenre = new JTextField(); 
       JTextField txtDuration = new JTextField(); 
       JTextField txtActor = new JTextField(); 
       JTextField txtDirector = new JTextField(); 
       JTextField txtSynopsis = new JTextField(); 

       JCheckBox rentCB = new JCheckBox(); 

       JButton btnAddProg = new JButton("Add Program"); 

       JList channelList = new JList(); 
       JList timeList = new JList(); 

       infoPanel.add(titleLabel); 
       infoPanel.add(txtTitle); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(genreLabel); 
       infoPanel.add(txtGenre); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(durationLabel); 
       infoPanel.add(txtDuration); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(actorLabel); 
       infoPanel.add(txtActor); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(directorLabel); 
       infoPanel.add(txtDirector); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(rentableLabel); 
       infoPanel.add(rentCB); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(synLabel); 
       infoPanel.add(txtSynopsis); 
       infoPanel.add(new JLabel(" ")); 
       infoPanel.add(btnAddProg); 
       infoPanel.add(channelList); 
       infoPanel.add(timeList); 

       centrePanel.add(chPanel); 
       centrePanel.add(infoPanel); 
       centrePanel.add(listPanel); 

       frame.add(mainPanel); 
       frame.setVisible(true); 


    } 


} 

ProgramTableModel:

import java.util.List; 

import javax.swing.table.AbstractTableModel; 

public class ProgramTableModel extends AbstractTableModel{ 

    protected String[] columnNames = {"Type","Title","Length"}; 

    private List<Program> data; 


    public ProgramTableModel (List<Program> data){ 
     this.data = data; 
    } 

    public int getColumnCount() { 
     return 3; 
    } 

    public int getRowCount() { 
     return data.size(); 
    } 

    public String getColumnName(int column) { 
     return columnNames[column]; 
    } 

    public Object getValueAt(int row, int column) { 

      switch (column){ 
      case 0: return data.get(row).getCategory(); 
      case 1: return data.get(row).getTitle(); 
      case 2: return data.get(row).getDuration(); 
      default: return "N/A"; 
      } 

    } 
} 

Обработка:

import java.io.*; 
import java.util.*; 


public class Processing 
{ 
    List<Program> schedule = new LinkedList<Program>(); 

    public void readAllData() { 

     try{ 
      FileInputStream fstream = new FileInputStream("file.txt"); 

      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String tempString = null; 





      while ((tempString = br.readLine()) != null) { 


       String[] row = tempString.split("-"); 

       if(row[0].compareTo("COMEDY") == 0) { 

        Comedy comedy = new Comedy(row[0], row[1], Integer.parseInt(row[2]), row[3], row[4], Boolean.parseBoolean(row[5])); 
        schedule.add(comedy); 

       } 

       else if(row[0].compareTo("DRAMA") == 0) { 

        Drama drama = new Drama(row[0], row[1], Integer.parseInt(row[2]), row[3], row[4], Boolean.parseBoolean(row[5])); 
        schedule.add(drama); 

       } 

       else if(row[0].compareTo("MUSIC") == 0) { 

        MusicVideo music = new MusicVideo(row[0], row[1], Integer.parseInt(row[2])); 
        schedule.add(music); 

       } 

       else if(row[0].compareTo("HOTEL") == 0) { 

        HotelInfo hotel = new HotelInfo(row[0], row[1], Integer.parseInt(row[2])); 
        schedule.add(hotel); 

       } 

      } 
      in.close(); 

     } 

     catch (Exception e){ 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 

    public void getAll() 
    { 
     for (Program p: schedule) 
     { 
      System.out.println(p.getTitle() + p.getDuration() + p.getCategory() + p); 
     } 
    } 

} 
+0

Можете ли вы сказать нам, где именно вы застряли? Ваш текущий вопрос немного на широкой стороне и почти потребует от вас написать учебник для вас. –

+0

В принципе, у меня есть LinkedList, хранящийся в Processing.java. Он содержит все данные, полученные из текстового файла. Я создал AbstractTableModel, чтобы сообщить JTable, как быть заполненным. Теперь я хочу заполнить JTable в GUI_g «содержимым связанного списка». Я уточню основной вопрос. – Brian

+0

* Снова *, как вы попытались добавить его в свою модель? Где ваша текущая попытка не работает? –

ответ

0

Вы можете добавить сброса Митос к вашему ProgramTableModel, который сбрасывает внутренний список:

public reset (List<Program> data){ 
    this.data = data; 
} 

, вызывайте reset() на модели объекта, который связан с listTable. Это означает, что вам нужно сохранить и выставить этот объект из GUI.

Примечание: вы можете управлять списком своей модели любым удобным вам способом: добавлять, удалять, заменять элементы, просто добавлять соответствующие методы, которые позволят желаемое поведение

+0

Не то же самое, что и 'public ProgramTableModel (Список данных) { \t \t this.data = data; \t} ' Делает? – Brian

+0

Проблема не совсем в ProgramTableModel, а в графическом интерфейсе. Как мне это назвать? Как в том, как я могу назвать ProgramTableModel? – Brian

+0

Это не одно и то же: тот, который вы только что указали в комментарии, является конструктором - вы можете только один раз создать объект. Вы можете, конечно, заменить модель на новую, если хотите, но тогда вам нужно выставить JTable вместо модели. Как вызвать метод на модели: вам нужно решить, какое место лучше хранить: если у вас есть доступ к объекту GUI_g, вы можете использовать это, в противном случае, сохранить модель в классе, который оба места (GUI и модель populator) имеют доступ (точнее, к одному и тому же объекту). Вы можете создать этот общий объект, скажем, в главном, и передать его другим – Attila

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