Jtable列中的ArrayList

阿奎尔·海德(Aqeel Haider)

我正在创建一个只有一个列(月份列)的Jtable,并借助按钮在该列中添加一个arraylist。

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);
            }
        });
    }

}
亚历克斯·西弗恩特斯(Alex Sifuentes)

您的问题是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返回什么

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将arrayList数据加载到JTable中

来自分类Dev

通过JTable从ArrayList中删除项目

来自分类Dev

在两列中过滤JTable

来自分类Dev

jTable在列中输入数据

来自分类Dev

Jtable中的列不显示

来自分类Dev

在Java中的JTable中设置列宽

来自分类Dev

将ArrayList数据递归添加到JTable中

来自分类Dev

使用AbstractTableModel和ArrayList在JTable中复制行

来自分类Dev

在jTable中添加包含数据的列

来自分类Dev

在Java的JTable列中显示BarChar

来自分类Dev

如何避免在Java中复制JTable列?

来自分类Dev

如何在JTable中读取特定的列?

来自分类Dev

如何在JTable中禁用特定列

来自分类Dev

使用ArrayList创建jTable

来自分类Dev

从ArrayList <T>构建JTable

来自分类Dev

限制JTable中的列宽度,但保留扩展列的能力

来自分类Dev

在Java中的jtable中设置下一列的数据

来自分类Dev

如何将将来的列从MySQL表添加到ArrayList并更新我的jTable?

来自分类Dev

如何使用 Arraylist 中的值填充 Jtable(Jtables 中的空指针异常)

来自分类Dev

使用ArrayList <String>填充JTable

来自分类Dev

如何获取JTable中列标题的字体和图形

来自分类常见问题

在JTable / TableModel中编辑列的单元格限制

来自分类Dev

如何在JTable中更改或查找列类型

来自分类Dev

如何在jtable中组合两个列标题

来自分类Dev

使用JRadioButtons更改JTable中的列不会刷新结构

来自分类Dev

在JTable列中为JXDatePicker设置最小日期

来自分类Dev

等效于DefaultTableModel中的JTable的getSelected列方法

来自分类Dev

如何在JTable列中显示HyperLink数据?

来自分类Dev

如何在JTable中更改或查找列类型