【问题标题】:ArrayList in Jtable ColumnJtable 列中的 ArrayList
【发布时间】:2015-10-31 10:33:43
【问题描述】:

我正在创建一个只有一列(月列)的 Jtable,并在按钮的帮助下在列中添加一个数组列表。

Arraylist 包含取决于检查月份的月份名称。

我的问题是当我添加数组列表时,前一行也发生了变化。

我不知道发生了什么。

这是我的问题代码

package test;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Jtable extends JFrame {

    JTable table;
    JButton button;
    JPanel mp;

    DefaultTableModel model;

    JCheckBox chkJan;
    JCheckBox chkFeb;
    JCheckBox chkMarch;
    JCheckBox chkApril;
    JCheckBox chkMay;
    JCheckBox chkJun;
    JCheckBox chkJuly;
    JCheckBox chkAug;
    JCheckBox chkSep;
    JCheckBox chkOct;
    JCheckBox chkNov;
    JCheckBox chkDec;

    List<String> Months = null;

    public Jtable() {

        table = new JTable();
        button = new JButton("Add to Table");
        mp = new JPanel();
        Months = new ArrayList<>();

        chkJan = new JCheckBox("JAN");
        chkFeb = new JCheckBox("FEB");
        chkMarch = new JCheckBox("MARCH");
        chkApril = new JCheckBox("APRIL");
        chkMay = new JCheckBox("MAY");
        chkJun = new JCheckBox("JUN");
        chkJuly = new JCheckBox("JULY");
        chkAug = new JCheckBox("AUG");
        chkSep = new JCheckBox("SEP");
        chkOct = new JCheckBox("OCT");
        chkNov = new JCheckBox("NOV");
        chkDec = new JCheckBox("DEC");

        mp.setLayout(new FlowLayout(FlowLayout.LEFT));
        mp.setSize(300, 200);

        mp.add(chkJan);
        mp.add(chkFeb);
        mp.add(chkMarch);
        mp.add(chkApril);
        mp.add(chkMay);
        mp.add(chkJun);
        mp.add(chkJuly);
        mp.add(chkAug);
        mp.add(chkSep);
        mp.add(chkOct);
        mp.add(chkNov);
        mp.add(chkDec);

        model = new DefaultTableModel();
        table.setModel(model);
        model.addColumn("Months");

        JScrollPane sp = new JScrollPane(table);

        setLayout(new BorderLayout());

        add(sp, BorderLayout.CENTER);
        add(button, BorderLayout.SOUTH);
        add(mp, BorderLayout.NORTH);
        setSize(800, 600);

        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Month();
                Object[] row = {Months};

                model.addRow(row);
            }
        });

    }

    public void Month() {
        Months.removeAll(Months);
        if (chkJan.isSelected()) {
            Months.add("January");
        } else {
            Months.remove("January");
        }

        if (chkFeb.isSelected()) {
            Months.add("Febuary");
        } else {
            Months.remove("Febuary");
        }

        if (chkMarch.isSelected()) {
            Months.add("March");
        } else {
            Months.remove("March");
        }

        if (chkApril.isSelected()) {
            Months.add("April");
        } else {
            Months.remove("April");
        }

        if (chkMay.isSelected()) {
            Months.add("May");
        } else {
            Months.remove("May");
        }

        if (chkJun.isSelected()) {
            Months.add("Jun");
        } else {
            Months.remove("Jun");
        }

        if (chkJuly.isSelected()) {
            Months.add("July");
        } else {
            Months.remove("July");
        }

        if (chkAug.isSelected()) {
            Months.add("August");
        } else {
            Months.remove("August");
        }

        if (chkSep.isSelected()) {
            Months.add("September");
        } else {
            Months.remove("September");
        }

        if (chkOct.isSelected()) {
            Months.add("Octuber");
        } else {
            Months.remove("Octuber");
        }

        if (chkNov.isSelected()) {
            Months.add("November");
        } else {
            Months.remove("November");
        }

        if (chkDec.isSelected()) {
            Months.add("December");
        } else {
            Months.remove("December");
        }
    }

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;

                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Jtable.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Jtable().setVisible(true);
            }
        });
    }

}

【问题讨论】:

  • 变量名不应以大写字符开头。您的 JCheckBox 字段都没有以大写字符开头,那么为什么 List 呢?始终如一!!!此外,方法名称不应以大写字符开头。这是基本的 Java 遵循 API 的约定,不要自己编造。不要给你的班级打电话Jtable。这与JTable 类名太接近了。更具描述性

标签: java swing jtable


【解决方案1】:

你的问题是Months 是全局的,你想要的是一个局部变量。如果您在某处编辑此变量,则使用它的每个对象(如行或您的表)都将反映其更改。

您可以将Months 移动到您只有本地访问权限的方法中的某个位置,如下所示:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        model.addRow(Months());
    }
});

然后,修改您的 Month 方法:

public Object[] Month() {
    List<String> Months = new ArrayList<>();
    if (chkJan.isSelected()) {
        Months.add("January");
    } else ...
    ...
    return new Object[]{Months};
}

另一件事是,将变量命名为小写 Months 可能是 months,并将方法命名为更易读的名称,例如 getSelectedMonths,最后,将类命名为 Jtable 会让人感到困惑,因为还有一个名称相似的 (JTable)。

编辑

再次检查后,我猜您的许多代码是多余的,您可以删除并优化,因为您只需要 Month 返回的内容。

【讨论】:

  • 非常感谢它的工作......我的原始表单很大,并且有 NetBeans 自动生成的代码。由于自动生成杂乱的代码,我无法在此处发布代码。我写了这个简短的代码来清楚地说明我的问题,再次感谢您的快速回复
  • 但我还是不明白它是如何改变前一行的。??
  • (1+) 即每次点击按钮并调用month()方法时都需要创建一个新的List
  • But i sill don't understand how it is changing the previous row.?? - 因为您只是将列表的“引用”添加到 TableModel,而不是列表中的实际数据。您的代码所做的只是更改数据,但引用仍然相同,因此您需要每次都创建一个新的 LIst 实例。
【解决方案2】:

改变

public void Month() {
        Months.removeAll(Months);
        ...

收件人:

public void Month() {
        Months = new ArrayList<>();
        ...

这样您就不会修改已存储在表中的月份。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2023-03-12
    • 2017-08-23
    • 2018-12-14
    • 2013-04-04
    • 2012-01-27
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多