将arrayList数据加载到JTable中

Posted

技术标签:

【中文标题】将arrayList数据加载到JTable中【英文标题】:Load arrayList data into JTable 【发布时间】:2013-12-29 21:14:45 【问题描述】:

我正在尝试从一个名为 FootballClub 的方法中设置项目,到目前为止一切正常。 但是后来我从中创建了一个arrayList,但不知何故我找不到将这些信息存储到JTable中的方法。 问题是我找不到设置固定行数的方法

这是我的代码:

类StartLeague:

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

public class startLeague implements LeagueManager

//setting the frame and other components to appear

public startLeague()
    JButton createTeam = new JButton("Create Team");
    JButton deleteTeam = new JButton("Delete Team");

    JFrame frame = new JFrame("Premier League System");
    JPanel panel = new JPanel();
    frame.setSize(1280, 800);
    frame.setVisible(true);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    String col[] = "Pos","Team","P", "W", "L", "D", "MP", "GF", "GA", "GD";

    panel.setLayout(new GridLayout(20, 20));
    panel.add(createTeam);
    panel.add(deleteTeam);
    panel.add(new JLabel(""));
    //JLabels to fill the space
    
    

足球俱乐部课:

import java.util.ArrayList;



 public class FootballClub extends SportsClub





   FootballClub(int position, String name, int points, int wins, int defeats, int draws, int totalMatches, int goalF, int goalA, int goalD)
   this.position = position;
   this.name = name;
   this.points = points;
   this.wins = wins;
   this.defeats = defeats;
   this.draws = draws;
   this.totalMatches = totalMatches;
   this.goalF = goalF;
   this.goalA = goalA;
   this.goalD = goalD;

   

SportsClub 类(摘要):

abstract class SportsClub 
int position;
String name;
int points;
int wins;
int defeats;
int draws;
int totalMatches;
int goalF;
int goalA;
int goalD;


最后是 LeagueManager,它是一个接口:

import java.util.ArrayList;


public interface LeagueManager 
ArrayList<FootballClub> originalLeagueTable = new ArrayList<FootballClub>();
FootballClub arsenal = new FootballClub(1, "Arsenal", 35, 11, 2, 2, 15, 30, 11, 19);
FootballClub liverpool = new FootballClub(2, "Liverpool", 30, 9, 3, 3, 15, 34, 18, 16);
FootballClub chelsea = new FootballClub(3, "Chelsea", 30, 9, 2, 2, 15, 30, 11, 19);
FootballClub mCity = new FootballClub(4, "Man City", 29, 9, 2, 4, 15, 41, 15, 26);
FootballClub everton = new FootballClub(5, "Everton", 28, 7, 1, 7, 15, 23, 14, 9);
FootballClub tot = new FootballClub(6, "Tottenham", 27, 8, 4, 3, 15, 15, 16, -1);
FootballClub newcastle = new FootballClub(7, "Newcastle", 26, 8, 5, 2, 15, 20, 21, -1);
FootballClub south = new FootballClub(8, "Southampton", 23, 6, 4, 5, 15, 19, 14, 5);


有人可以帮帮我吗? 我已经尝试了好几天。 谢谢。

【问题讨论】:

我不认为 JTable 将 ArrayList 作为数据参数。你需要一个向量或二维数组 另外,目前您的 ArrayList 将是空的,因为您创建了新的足球俱乐部但没有将它们添加到列表中。 【参考方案1】:

“问题是我找不到设置固定行数的方法”

您不需要设置行数。使用TableModel。特别是DefaultTableModel

String col[] = "Pos","Team","P", "W", "L", "D", "MP", "GF", "GA", "GD";

DefaultTableModel tableModel = new DefaultTableModel(col, 0);
                                            // The 0 argument is number rows.

JTable table = new JTable(tableModel);

然后您可以使用Object[]tableModel 添加行

Object[] objs = 1, "Arsenal", 35, 11, 2, 2, 15, 30, 11, 19;

tableModel.addRow(objs);

您可以循环添加您的 Object[] 数组。

注意:JTable 目前不允许将输入数据实例化为ArrayList。它必须是 Vector 或数组。

见JTable 和DefaultTableModel。另外,How to Use JTable tutorial

“我从它创建了一个 arrayList,但不知何故我找不到将这些信息存储到 JTable 中的方法。”

你可以这样做来添加数据

ArrayList<FootballClub> originalLeagueList = new ArrayList<FootballClub>();

originalLeagueList.add(new FootballClub(1, "Arsenal", 35, 11, 2, 2, 15, 30, 11, 19));
originalLeagueList.add(new FootballClub(2, "Liverpool", 30, 9, 3, 3, 15, 34, 18, 16));
originalLeagueList.add(new FootballClub(3, "Chelsea", 30, 9, 2, 2, 15, 30, 11, 19));
originalLeagueList.add(new FootballClub(4, "Man City", 29, 9, 2, 4, 15, 41, 15, 26));
originalLeagueList.add(new FootballClub(5, "Everton", 28, 7, 1, 7, 15, 23, 14, 9));
originalLeagueList.add(new FootballClub(6, "Tottenham", 27, 8, 4, 3, 15, 15, 16, -1));
originalLeagueList.add(new FootballClub(7, "Newcastle", 26, 8, 5, 2, 15, 20, 21, -1));
originalLeagueList.add(new FootballClub(8, "Southampton", 23, 6, 4, 5, 15, 19, 14, 5));

for (int i = 0; i < originalLeagueList.size(); i++)
   int position = originalLeagueList.get(i).getPosition();
   String name = originalLeagueList.get(i).getName();
   int points = originalLeagueList.get(i).getPoinst();
   int wins = originalLeagueList.get(i).getWins();
   int defeats = originalLeagueList.get(i).getDefeats();
   int draws = originalLeagueList.get(i).getDraws();
   int totalMatches = originalLeagueList.get(i).getTotalMathces();
   int goalF = originalLeagueList.get(i).getGoalF();
   int goalA = originalLeagueList.get(i).getGoalA();
   in ttgoalD = originalLeagueList.get(i).getTtgoalD();

   Object[] data = position, name, points, wins, defeats, draws, 
                               totalMatches, goalF, goalA, ttgoalD;

   tableModel.add(data);


【讨论】:

对您的 FootballClub 来说是的 所以,它会是这样的: int max = Array.get(0); for (int i = 1; i max) max = array.get(i); 为了什么?对于你的吸气剂?您的吸气剂应该在您的FootBallClub 中,并且只需要返回数据字段值。 public int getPosition() return position; -1,创建 FootballClub 对象然后立即从 FootballClub 获取数据并创建数据数组是没有意义的。如果您想使用 DefaultTableModel,那么只需将数据直接加载到数组中,或者按照其他答案中的建议创建自定义 TableModel。 @camickr 你是对的,但我的例子并不是暗示这样做。我只是将代码放在一起来展示它的外观,因为 OP 还没有将任何 FootballClub 对象添加到列表中。【参考方案2】:

您可能需要使用TableModel (Oracle's tutorial here)

如何实现自己的TableModel

public class FootballClubTableModel extends AbstractTableModel 
  private List<FootballClub> clubs ;
  private String[] columns ; 

  public FootBallClubTableModel(List<FootballClub> aClubList)
    super();
    clubs = aClubList ;
    columns = new String[]"Pos","Team","P", "W", "L", "D", "MP", "GF", "GA", "GD";
  

  // Number of column of your table
  public int getColumnCount() 
    return columns.length ;
  

  // Number of row of your table
  public int getRowsCount() 
    return clubs.size();
  

  // The object to render in a cell
  public Object getValueAt(int row, int col) 
    FootballClub club = clubs.get(row);
    switch(col) 
      case 0: return club.getPosition();
      // to complete here...
      default: return null;
    
  

  // Optional, the name of your column
  public String getColumnName(int col) 
    return columns[col] ;
  


您可能需要覆盖TableModel 的其他方法,这取决于您想要做什么,但这里是理解和实现的基本方法:) 像这样使用它

List<FootballClub> clubs = getFootballClub();
TableModel model = new FootballClubTableModel(clubs);
JTable table = new JTable(model);

希望对您有所帮助!

【讨论】:

在这里你说完成的部分,意思是我必须创建getPosition方法,对吧? @jPratas 在getValueAt(int row, int col) 中,您必须返回单元格中的元素。因此,如果col = 0,则返回足球俱乐部的位置,如果col = 1,则返回球队名称,如果col = 2 点,等等。这取决于足球的哪个属性您想在列号col 上显示的俱乐部。当然,您需要像getPosition()getName() 这样的getter ...也许您将属性设置为public 以避免getter,但这不是一个好习惯:) 对于这个作业,我不得不使用 SportsClub 作为一个抽象类。我在一个单独的项目中测试了你的方式,它工作得很好。非常感谢您的帮助:) 非常好的例子,易于理解和小代码。【参考方案3】:

我从中创建了一个 arrayList,但不知何故我找不到将这些信息存储到 JTable 中的方法。

DefaultTableModel 不支持显示存储在 ArrayList 中的自定义对象。您需要创建一个自定义 TableModel。

您可以查看Bean Table Model。它是一个可重用的类,它将使用反射来查找 FootballClub 类中的所有数据并显示在 JTable 中。

或者,您可以扩展上述链接中的Row Table Model,以便通过实现一些方法来更轻松地创建您自己的自定义 TableModel。 JButtomTableModel.java 源代码提供了一个完整的示例来说明如何做到这一点。

【讨论】:

+1 for BeanTableModel 我不知道...真棒! 对于这个作业,我必须在 java swing 库中构建表。但是,这个答案非常有用,我将在未来的项目中使用这项技术。谢谢你:)【参考方案4】:

您可以像我对 List > 或任何其他 Arraylist 所做的那样,类型从其他名为 PingScan 返回 List> 的类返回,因为它实现了服务执行器。无论如何,代码记录下来,您可以使用 foreach 并从 List 中检索数据。

 PingScan p = new PingScan();
 List<Future<String>> scanResult = p.checkThisIP(jFormattedTextField1.getText(), jFormattedTextField2.getText());
                for (final Future<String> f : scanResult) 
                    try 
                        if (f.get() instanceof String) 
                            String ip = f.get();
                            Object[] data = ip;
                            tableModel.addRow(data);
                        
                     catch (InterruptedException | ExecutionException ex) 
                        Logger.getLogger(gui.class.getName()).log(Level.SEVERE, null, ex);
                    
                

【讨论】:

【参考方案5】:

像我这样的初学者的基本方法。

public void loadDataToJtable(ArrayList<String> liste)
        
    rows = table.getRowCount();

    cols = table.getColumnCount();

    for (int i = 0; i < rows ; i++) 

            for ( int k  = 0; k < cols ; k++) 
            
            for (int h = 0; h < list1.size(); h++) 
                
                String b =  list1.get(h);
                b = table.getValueAt(i, k).toString();
                
            
        
    

【讨论】:

以上是关于将arrayList数据加载到JTable中的主要内容,如果未能解决你的问题,请参考以下文章

递归地将 ArrayList 数据添加到 JTable 中

如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定到 JTable?

将数据从txt文件加载到JTable

jTable beansbinding

以正确的顺序向 JTable 添加行。

如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?