添加项目和刷新 JTable
Adding items and refrfeshing JTable
所以,问题来了 - 我想在 arraylist 中添加项目 if class,并且在 class 中填充所有 pols 之后我需要刷新 Jtable,但我不知道如何.
这是我的代码:
主要(){
JFrame frame = new JFrame();
frame.setSize(550, 450);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton jb1 = new JButton("Добавить");
JButton jb2 = new JButton("Удалить");
JButton jb3 = new JButton("Редактировать");
JButton jb4 = new JButton("Найти мощную машину");
frame.add(jb1);
frame.add(jb2);
frame.add(jb3);
String[] tbheader = {"ID", "Машина", "Модель", "Цвет", "Мощность", "Объём бака"};
String[][] tbdata = new String[cdb.size()][6];
int i = 0;
for (CarDB temp:cdb){
tbdata[i][0] = Integer.toString(i + 1);
tbdata[i][0] = temp.Brand;
tbdata[i][0] = temp.Model;
tbdata[i][0] = temp.Color;
tbdata[i][0] = Short.toString(temp.Power);
tbdata[i][0] = Short.toString(temp.TankVol);
i++;
}
JTable jt = new JTable(tbdata, tbheader);
frame.add(new JScrollPane(jt));
jt.setSize(550, 320);
jt.setPreferredScrollableViewportSize(jt.getSize());
jt.setShowHorizontalLines(true);
jt.setShowVerticalLines(true);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
AddCarInList();
jt.repaint();
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DeleteCarFromList();
}
});
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ChooseCarId();
}
});
frame.add(jb4);
jb4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FindPowerfulCar();
}
});
jb2.addActionListener(this);
jb3.addActionListener(this);
jb4.addActionListener(this);
frame.setVisible(true);
this.cdb = new ArrayList<>();
}
public void AddCarInList() {
JFrame addCar = new JFrame();
addCar.setSize(250, 300);
addCar.setLayout(new FlowLayout());
JLabel l_br = new JLabel("Введите марку");
JLabel l_md = new JLabel("Введите модель");
JLabel l_cl = new JLabel("Введите цвет");
JLabel l_pw = new JLabel("Введите мощность");
JLabel l_tv = new JLabel("Введите объём бака");
JTextField t_br = new JTextField(20);
JTextField t_md = new JTextField(20);
JTextField t_cl = new JTextField(20);
JTextField t_pw = new JTextField(4);
JTextField t_tv = new JTextField(3);
JButton conf = new JButton("Добавить");
addCar.add(l_br);
addCar.add(t_br);
addCar.add(l_md);
addCar.add(t_md);
addCar.add(l_cl);
addCar.add(t_cl);
addCar.add(l_pw);
addCar.add(t_pw);
addCar.add(l_tv);
addCar.add(t_tv);
addCar.add(conf);
conf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (CheckStr(t_br.getText(), t_md.getText(), t_cl.getText())) {
if (CheckShort(t_pw.getText(), t_tv.getText())) {
CarDB car = new CarDB(
t_br.getText(),
t_md.getText(),
t_cl.getText(),
Short.parseShort(t_pw.getText()),
Short.parseShort(t_tv.getText()));
cdb.add(car);
System.out.println(cdb.indexOf(car) + 1
+ " " + cdb.get(0).Brand
+ " " + cdb.get(0).Model
+ " " + cdb.get(0).Color
+ " " + cdb.get(0).Power
+ " " + cdb.get(0).TankVol);
addCar.setVisible(false);
} else Alert(1);
} else Alert(3);
}
});
addCar.setVisible(true);
}
有人知道如何解决这个问题吗?
面向对象编程就是扩展classes。
您应该扩展的 classes 之一是 AbstractTableModel 作为 model 到您的 JTable。
以this为例。
之后,您更新此 model class 然后通过调用刷新:
model.fireTableDataChanged()(更新行)或
model.fireTableStructureChanged()(更新行+列)
cdb
字段是汽车列表。在 AddCarInList
方法中,汽车被添加到列表中。问题是这个列表只用于初始化 table 一次。正如 MadProgrammer 已经建议的那样,您可以通过更新 table 模型来解决这个问题。
您可以像这样更改 table 初始化:
Vector<String> columnNames = new Vector<>(Arrays.asList(tbheader));
Vector<Vector<Object>> dataVector = new Vector<>();
tableModel = new DefaultTableModel(dataVector, columnNames);
JTable jt = new JTable(tableModel);
上面的代码假定您已经添加了 tableModel
类型 DefaultTableModel
的字段。在 AddCarInList
方法中,您可以向 table 模型添加一行:
final Vector<String> rowVector = new Vector<>();
rowVector.add(t_br.getText());
rowVector.add(t_md.getText());
rowVector.add(t_cl.getText());
rowVector.add(t_pw.getText());
rowVector.add(t_tv.getText());
tableModel.addRow(rowVector);
向 table 模型添加一行应该会自动刷新 table。
所以,问题来了 - 我想在 arraylist 中添加项目 if class,并且在 class 中填充所有 pols 之后我需要刷新 Jtable,但我不知道如何.
这是我的代码: 主要(){
JFrame frame = new JFrame();
frame.setSize(550, 450);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
JButton jb1 = new JButton("Добавить");
JButton jb2 = new JButton("Удалить");
JButton jb3 = new JButton("Редактировать");
JButton jb4 = new JButton("Найти мощную машину");
frame.add(jb1);
frame.add(jb2);
frame.add(jb3);
String[] tbheader = {"ID", "Машина", "Модель", "Цвет", "Мощность", "Объём бака"};
String[][] tbdata = new String[cdb.size()][6];
int i = 0;
for (CarDB temp:cdb){
tbdata[i][0] = Integer.toString(i + 1);
tbdata[i][0] = temp.Brand;
tbdata[i][0] = temp.Model;
tbdata[i][0] = temp.Color;
tbdata[i][0] = Short.toString(temp.Power);
tbdata[i][0] = Short.toString(temp.TankVol);
i++;
}
JTable jt = new JTable(tbdata, tbheader);
frame.add(new JScrollPane(jt));
jt.setSize(550, 320);
jt.setPreferredScrollableViewportSize(jt.getSize());
jt.setShowHorizontalLines(true);
jt.setShowVerticalLines(true);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
AddCarInList();
jt.repaint();
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DeleteCarFromList();
}
});
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ChooseCarId();
}
});
frame.add(jb4);
jb4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FindPowerfulCar();
}
});
jb2.addActionListener(this);
jb3.addActionListener(this);
jb4.addActionListener(this);
frame.setVisible(true);
this.cdb = new ArrayList<>();
}
public void AddCarInList() {
JFrame addCar = new JFrame();
addCar.setSize(250, 300);
addCar.setLayout(new FlowLayout());
JLabel l_br = new JLabel("Введите марку");
JLabel l_md = new JLabel("Введите модель");
JLabel l_cl = new JLabel("Введите цвет");
JLabel l_pw = new JLabel("Введите мощность");
JLabel l_tv = new JLabel("Введите объём бака");
JTextField t_br = new JTextField(20);
JTextField t_md = new JTextField(20);
JTextField t_cl = new JTextField(20);
JTextField t_pw = new JTextField(4);
JTextField t_tv = new JTextField(3);
JButton conf = new JButton("Добавить");
addCar.add(l_br);
addCar.add(t_br);
addCar.add(l_md);
addCar.add(t_md);
addCar.add(l_cl);
addCar.add(t_cl);
addCar.add(l_pw);
addCar.add(t_pw);
addCar.add(l_tv);
addCar.add(t_tv);
addCar.add(conf);
conf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (CheckStr(t_br.getText(), t_md.getText(), t_cl.getText())) {
if (CheckShort(t_pw.getText(), t_tv.getText())) {
CarDB car = new CarDB(
t_br.getText(),
t_md.getText(),
t_cl.getText(),
Short.parseShort(t_pw.getText()),
Short.parseShort(t_tv.getText()));
cdb.add(car);
System.out.println(cdb.indexOf(car) + 1
+ " " + cdb.get(0).Brand
+ " " + cdb.get(0).Model
+ " " + cdb.get(0).Color
+ " " + cdb.get(0).Power
+ " " + cdb.get(0).TankVol);
addCar.setVisible(false);
} else Alert(1);
} else Alert(3);
}
});
addCar.setVisible(true);
}
有人知道如何解决这个问题吗?
面向对象编程就是扩展classes。
您应该扩展的 classes 之一是 AbstractTableModel 作为 model 到您的 JTable。
以this为例。
之后,您更新此 model class 然后通过调用刷新:
model.fireTableDataChanged()(更新行)或
model.fireTableStructureChanged()(更新行+列)
cdb
字段是汽车列表。在 AddCarInList
方法中,汽车被添加到列表中。问题是这个列表只用于初始化 table 一次。正如 MadProgrammer 已经建议的那样,您可以通过更新 table 模型来解决这个问题。
您可以像这样更改 table 初始化:
Vector<String> columnNames = new Vector<>(Arrays.asList(tbheader));
Vector<Vector<Object>> dataVector = new Vector<>();
tableModel = new DefaultTableModel(dataVector, columnNames);
JTable jt = new JTable(tableModel);
上面的代码假定您已经添加了 tableModel
类型 DefaultTableModel
的字段。在 AddCarInList
方法中,您可以向 table 模型添加一行:
final Vector<String> rowVector = new Vector<>();
rowVector.add(t_br.getText());
rowVector.add(t_md.getText());
rowVector.add(t_cl.getText());
rowVector.add(t_pw.getText());
rowVector.add(t_tv.getText());
tableModel.addRow(rowVector);
向 table 模型添加一行应该会自动刷新 table。