【问题标题】:ArrayList add() method not working. Can't add another value and add it to jTableArrayList add() 方法不起作用。无法添加另一个值并将其添加到 jTable
【发布时间】:2019-11-18 11:13:15
【问题描述】:

我的代码有问题。我目前正在制作一个在 ArrayList 上存储临时数据的项目。我已经创建了代码,但是当我测试它时,ArrayList 的 add() 方法似乎不起作用。 我在jTable 上显示ArrayList,但它总是返回空,即使add() 方法给出了成功通知。

我在这里阅读了另一种解决方案,但没有一个适合我的问题。 这是我的代码。我有 3 节课

Input.java

package latihan;

import com.sun.xml.internal.ws.developer.JAXWSProperties;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author anang
 */
public class Input extends javax.swing.JFrame {
    Latihan latihan = new Latihan();
    /**
     * Creates new form Input
     */
    public Input() {
        initComponents();
    }                      

    private void btnKirimActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        String nik = txtNIK.getText();
        String lap = txtLaporan.getText();

        try {
            latihan.addLaporan(nik,lap);
            JOptionPane.showMessageDialog(null,"Berhasil");
            Tabel t = new Tabel();
            t.setVisible(true);
            this.setVisible(false);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,e);
        }

    }                                        
    public ArrayList<String[]> getLaporan(){
        ArrayList<String[]> arr = latihan.getLaporan();
        return arr;
    }                 
}

二等 Latihan.java

package latihan;

import java.util.ArrayList;
import javax.swing.JOptionPane;

public class Latihan {
    private ArrayList<String[]> lap = new ArrayList<String[]>();

    public static void main(String[] args) {

    }

    public ArrayList<String[]> getLaporan(){
        return this.lap;
    }

    public void addLaporan(String Nik, String Lap){
        String[] data = new String[]{Nik,Lap};
        JOptionPane.showMessageDialog(null,"Data yang diinputkan = "+Nik+" "+Lap, "Latihan.java",JOptionPane.INFORMATION_MESSAGE);
        this.lap.add(data);
    }

}

第三课 Tabel.java

package latihan;

import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author anang
 */
public class Tabel extends javax.swing.JFrame {
    //Input i = new Input();
    private Input input;
    public Tabel() {
        initComponents();
        addDataToTable();
    }                       

    private void btnTambahActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:        
        input.setVisible(true);
        this.setVisible(false);

    }                                         

    public void addDataToTable(){
        DefaultTableModel tbModel = (DefaultTableModel) jTable1.getModel();
        tbModel.setRowCount(0);
        ArrayList<String[]> arr = input.getLaporan();

        Object rowData[] = new Object[2];
        JOptionPane.showMessageDialog(null,"Jumlah data : "+arr.size());
        for(int i=0;i<arr.size();i++){
            JOptionPane.showMessageDialog(null,arr.get(0)[0]);
            rowData[0] = arr.get(i)[0];
            rowData[1] = arr.get(i)[1];
            tbModel.addRow(rowData);
        }
    }                
}

我的代码有什么问题??有人可以帮帮我吗?

谢谢

【问题讨论】:

  • 当您说“我在 jTable 上显示 ArrayList,但它总是返回空”时,您指的是 addDataToTable 在您的 Tabel 类中没有使用选项更新 JOptionPane来自ArrayList?
  • @Ambro-r,当我在 Table 类中得到 arr.size() 时,它总是返回 0,即使在 Latihan 类中的 addLaporan() 方法之后也是如此
  • 你的问题与你的堆栈和你调用类的方式有关。请参阅下面的扩展答案。
  • 问题在于你的设计。摆脱 ArrayList。只需将数据直接添加到 TableModel。 TableModel 是用于存储数据的数据结构。无需将数据存储在两个地方。
  • @camickr 这是我讲师的作业,我们被分配使用 ArrayList。

标签: java swing arraylist


【解决方案1】:

所以你的JOptionPane 没有用你的ArrayList 的值更新的原因是你的ArrayList 是空的。 add() 方法工作正常,是您的实现不正确。

addDataToTable() 中,当您调用ArrayList&lt;String[]&gt; arr = input.getLaporan(); 时,它将获取ArrayList 存储在您的Input 类实例中的Tabel 实例(...拼写...)。您正在调用的Input 实例与您从中创建Tabel 实例的实例完全不同,因为在您的Tabel 类中,您实例化了一个新的Input。因此,您正在检索的 ArrayList 将是空白的,因为在 Tabel 的实例中没有运行任何调用 add 方法的代码。

困惑?本质上,这与您的堆栈和调用类的方式有关:

要尝试显示同一类中的变量如何根据实例不同,您可以运行以下示例:

import java.util.ArrayList;

public class MyListClass {

  private ArrayList<String> list = new ArrayList<>();
  private static ArrayList<String> staticList = new ArrayList<>();

  public MyListClass(int instance) {
    for(int i = 0; i < instance; i++) {
        list.add(instance + ":" +i);
        staticList.add(instance + ":" +i);
    }
  }

  public ArrayList<String> getList() {
    return list;
  }

  public ArrayList<String> getStaticListList() {
    return staticList;
  }

}

public class MyInstanceClass {

  private int instance;
  private MyListClass listClass;

  public MyInstanceClass(int instance) {
    this.instance = instance;
    listClass = new MyListClass(instance);
  }

  public void showMeWhatYourListLooksLike() {
    System.out.println(String.format("For instance %d, the list has the following info: %s", instance, listClass.getList().toString()));
  }

  public void showMeWhatYourStaticListLooksLike() {
    System.out.println(String.format("For instance %d, the STATIC list has the following info: %s", instance, listClass.getStaticListList().toString()));
  }


  public void createAnotherInstance() {
    MyInstanceClass anotherInstance = new MyInstanceClass(30);
    anotherInstance.showMeWhatYourListLooksLike();
  }

}

public class MyMainClass {

  public static void main(String...args) {
    MyInstanceClass myInstanceClass01 = new MyInstanceClass(1);
    MyInstanceClass myInstanceClass05 = new MyInstanceClass(5);
    MyInstanceClass myInstanceClass10 = new MyInstanceClass(10);

    myInstanceClass01.showMeWhatYourListLooksLike();
    myInstanceClass05.showMeWhatYourListLooksLike();
    myInstanceClass10.showMeWhatYourListLooksLike();

    myInstanceClass01.showMeWhatYourStaticListLooksLike();
    myInstanceClass05.showMeWhatYourStaticListLooksLike();
    myInstanceClass10.showMeWhatYourStaticListLooksLike();

    myInstanceClass10.createAnotherInstance();
  }

}

...请注意,对于每个实例,MyInstanceClass 调用 showMeWhatYourListLooksLike() 时打印输出的列表是不同的,但是调用 showMeWhatYourStaticListLooksLike() 时打印输出的列表是相同的。那是因为static 列表在所有实例MyListClass 之间共享(这样想......当某事是static 时,只能有一个)。

...您还会注意到在myInstanceClass10 内创建另一个MyInstanceClass 实例会发生什么。

所以要解决您的紧迫问题。无需在Tabel 中创建新的Input 对象,只需在实例化Tabel 时传递您的Latihan 对象并直接从该对象调用列表。

public class Input extends javax.swing.JFrame {
  Latihan latihan = new Latihan();

  public Input() {
     initComponents();
   }                      

  private void btnKirimActionPerformed(java.awt.event.ActionEvent evt) {                                         
      ...
      try {
        ...
        Tabel t = new Tabel(latihan);
        ...
      } catch (Exception e) {
        JOptionPane.showMessageDialog(null,e);
      }
  }                                        

}

public class Tabel extends javax.swing.JFrame {

  public Tabel(Latihan latihan) {
    ...
    addDataToTable(latihan);
  }    

  public void addDataToTable(Latihan latihan){
    ...
    ArrayList<String[]> arr = latihan.getLaporan();
    ...
  }                
}

【讨论】:

  • 很抱歉没有包含此代码,但是如果将Tabel 的构造函数设置为这样,则打开jframe 会出现问题。 public static void main(String args[]){ java.awt.EventQueue.invokeLater(newRunnable(){ public void run() { newTabel().setVisible(true); } }); }
  • 这个问题我该怎么办?
  • @AnangHariyantoN,这段代码在哪里运行?这不是你的问题。我也不是 100% 确定您要达到的目标。
  • 在 Tabel 类中运行的代码。 Tabel 是 NetBeans 中的 JFrame 表单
  • 这是 NetBeans 上的完整项目drive.google.com/file/d/1IPt-Q8chsgCoi5928WEZtV_-1ALo--mI/… .. 如果您愿意帮助我,我将非常高兴.. 谢谢
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 2017-07-31
  • 2011-07-25
  • 1970-01-01
  • 2015-01-16
  • 2020-12-03
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多