【问题标题】:How to display specific items from an ArrayList based on a value from another ArrayList?如何根据另一个 ArrayList 中的值显示 ArrayList 中的特定项目?
【发布时间】:2019-04-25 05:47:19
【问题描述】:

我目前正在执行一项任务,我必须创建一个软件开发解决方案以允许经理添加新员工和任务。为此,我有一个名为staffMembersArrayList,它以姓名、等级和薪水作为参数,还有一个名为tasksToDo 的数组列表,它以taskNametaskGradetaskHours 作为参数。

其中一个要求是允许经理单击JButton,这将只显示等级等于或大于所选任务的taskGrade 的staffMembers(使用JComboBox 选择)。结果将显示在JTable

private void jButtonSelectTaskActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    int num1 = this.jobGrade;//use the int supplied 
    //by user
    String[] colNames = {"Name", "Grade", "Montlhly Salary/Hourly Rate"};
    DefaultTableModel model = (DefaultTableModel) staffByTaskGradeTable.getModel();

    Object rowData[][] = new Object[staffMembers.size()][3];
    for (int i = 0; i < staffMembers.size(); i++) {
        if (staffMembers.get(i).grade > num1) {

            rowData[i][0] = staffMembers.get(i).name;
            rowData[i][1] = staffMembers.get(i).grade;
            rowData[i][2] = staffMembers.get(i).getCost();

            model.setDataVector(rowData, colNames);
        }
    }

但是,上面的代码没有给出所需的结果,我希望有人能指出我正确的方向。

【问题讨论】:

  • 它给出了什么结果?
  • 分享您的代码结果并添加一个实际问题。
  • 它给了我所有员工的名单,包括那些等级低于工作等级的人
  • this.jobGrade 到底在哪里,它有什么价值(最初并可能重新分配)?
  • @deHaar this.jobGrade 在创建任务后从 tasksToDo ArrayList 中获取值

标签: java swing arraylist jtable jcombobox


【解决方案1】:

每次获得匹配项时,您都在设置 model.setDataVector。此外,(sm.grade &gt; num1) 必须有 >= 比较,如果您想要 等于或大于 等级。

此外,您不应多次使用 get(i),只使用一次并将其存储在变量中以进行任何进一步的操作。或者只使用 forEach。(如果您使用 java8+,则使用 lambda)

private void jButtonSelectTaskActionPerformed(java.awt.event.ActionEvent evt) {                                                  

int num1 = this.jobGrade;//use the int supplied 
//by user
String[] colNames = {"Name", "Grade", "Montlhly Salary/Hourly Rate"};
DefaultTableModel model = (DefaultTableModel) staffByTaskGradeTable.getModel();

List<Object[]> rowData = new ArrayList<>();
Object[] member;
for (StaffMember sm:staffMembers) {
    if (sm.grade >= num1) {
        rowData.add(new Object[] {(Object)sm.name, (Object)sm.grade, 
                 (Object)sm.getCost()});
    }
}
model.setDataVector(rowData.toArray(new Object[rowData.size()][]), colNames);

【讨论】:

  • 非常感谢您的建议。但是,我仍然得到相同的结果。
【解决方案2】:
Object rowData[][] = new Object[staffMembers.size()][3];
for (int i = 0; i < staffMembers.size(); i++) {
    if (staffMembers.get(i).grade > num1) {

        rowData[i][0] = staffMembers.get(i).name;
        rowData[i][1] = staffMembers.get(i).grade;
        rowData[i][2] = staffMembers.get(i).getCost();

        model.setDataVector(rowData, colNames);
    }
}

不要使用上述代码。假设所有工作人员都被选中,您将在 2D 阵列中保留空间。如果只有第一个和最后一个符合您的标准怎么办?表格中间会有一堆空行。

相反,您应该在满足特定条件时向模型动态添加一行数据。比如:

String[] colNames = {"Name", "Grade", "Montlhly Salary/Hourly Rate"};
DefaultTableModel model = new DefaultTableModel(colNames, 0); // create empty model


for (int i = 0; i < staffMembers.size(); i++) {
    if (staffMembers.get(i).grade > num1) {
        Vector<Object> row = new Vector<Object>(3);
        row.add( staffMembers.get(i).name );
        row.add( staffMembers.get(i).grade );
        row.add( staffMembers.get(i).getCost() );
        model.addRow( row );
    }
}

staffByTaskGradeTable.setModel( model );

您仍然需要调试为什么您的“if 条件”没有达到您的预期。

或者你怎么知道你正在替换框架上可见的表格模型中的数据。也许您必须实例化表格,并且框架上只有一个可见。一个简单的测试,只需将方法中的所有代码替换为:

DefaultTableModel model = new DefaultTableModel(5, 5); 
staffByTaskGradeTable.setModel(model);

现在您应该会看到一个 5 行 5 列的空表。如果这可行,则问题出在您的“如果条件”上。数据不是你所期望的。

【讨论】:

  • 感谢您的建议。我认为我的问题是在 jComboBox 中选择 jobGrade 的值。假设对象被转换为字符串并且我试图获得一个 int 值。那有意义吗?我的术语不是最好的,因为我比较新,只是学习 Swing 的基础知识
  • Assuming that the objects are converted to strings - 为什么要转换成字符串?如果该值是一个 int,那么它应该作为 int 存储在您的对象中,以便您可以与作为 int 的“num1”变量进行比较。如果您的对象将值存储为字符串,那么您首先需要使用 Integer.parseInt(...) 方法将其转换为 int。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 2016-04-18
  • 2020-01-03
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多