Jtable 列中的 ArrayList
ArrayList in Jtable Column
我正在创建一个 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);
}
});
}
}
你的问题是Months
是全局的,你要的是局部变量。如果你在某处编辑这个变量,每个使用它的对象(比如行或你 table)都会反映它的变化。
您可以将 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
最后,令人困惑将您的 class 命名为 Jtable
,因为还有另一个名称相似 (JTable
)。
编辑
再次查看,我猜你的很多代码是多余的,你可以去掉优化,因为你只需要 Month
returns.
改变
public void Month() {
Months.removeAll(Months);
...
收件人:
public void Month() {
Months = new ArrayList<>();
...
这样您就不会修改已经存储在 table 中的月份。
我正在创建一个 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);
}
});
}
}
你的问题是Months
是全局的,你要的是局部变量。如果你在某处编辑这个变量,每个使用它的对象(比如行或你 table)都会反映它的变化。
您可以将 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
最后,令人困惑将您的 class 命名为 Jtable
,因为还有另一个名称相似 (JTable
)。
编辑
再次查看,我猜你的很多代码是多余的,你可以去掉优化,因为你只需要 Month
returns.
改变
public void Month() {
Months.removeAll(Months);
...
收件人:
public void Month() {
Months = new ArrayList<>();
...
这样您就不会修改已经存储在 table 中的月份。