[英]Fill row values to SWING JTable JAVA using an arrayList values
我想根据arrayList数据向JTable动态添加和填充行。 JTable列标题是固定的。 例如:3根据列数,应逐行显示。
这里values1是一个arrayList。 它包含所有行数据值。
values2是另一个数组列表,用于根据列数提取行值。
for (int v = 0; v < values1.size(); v++) {
values2.add(values1.get(v));
}
我使用此代码向JTable添加行。
Object jFill[] = values2.toArray();
model.addRow(jFill);
由于列数为3,它将仅填充第一行(水平3个单元格)。如何根据values2内的值填充其他数据以增加行数。
谢谢。
尝试以下操作,遍历列表并将每三个值放在一行中(如果您有3列):
int counter=0;
for (int v = 0; v < values1.size(); v++) {
if(counter<3){
values2.add(values1.get(v));
counter++;
}
if(counter==3||v>=values1.size){
Object jFill[] = values2.toArray();
model.addRow(jFill);
}
}
在这里,我可以使用的完整工作表模型可以运行,您可以添加行,删除行并更改值。
您可以轻松地添加到框架:
protected MyTableModel mytableModel = new MyTableModel();
scroll = new JScrollPane(mytableModel);
表类:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import org.apache.poi.ss.usermodel.Header;
class MyTableModel extends JPanel {
private static final int CHECK_COL = 5;
private static Object[][] DATA = { };
public static String[] COLUMNS = {"Col1","Col2","Col3","Col4","Col5", "Checkbox"};
protected DataModel dataModel = new DataModel(DATA, COLUMNS);
private JTable table = new JTable(dataModel);
private DefaultListSelectionModel selectionModel;
public MyTableModel(){
super(new BorderLayout());
this.add(new JScrollPane(table));
this.add(new ControlPanel(), BorderLayout.SOUTH);
table.setPreferredScrollableViewportSize(new Dimension(250, 175));
selectionModel = (DefaultListSelectionModel) table.getSelectionModel();
JTableHeader header = table.getTableHeader();
header.setDefaultRenderer(new HeaderRenderer(table));
}
private class DataModel extends DefaultTableModel {
public DataModel(Object[][] data, Object[] COLUMNS) {
super(data, COLUMNS);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == CHECK_COL) {
return getValueAt(0, CHECK_COL).getClass();
}
return super.getColumnClass(columnIndex);
}
@Override
public boolean isCellEditable(int row, int column) {
if(column==CHECK_COL && !Main.checked)
return true;
return false;
}
}
private static class HeaderRenderer implements TableCellRenderer {
DefaultTableCellRenderer renderer;
public HeaderRenderer(JTable table) {
renderer = (DefaultTableCellRenderer)
table.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(JLabel.CENTER);
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int col) {
return renderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, col);
}
}
private class ControlPanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = -7342459414751761853L;
public ControlPanel() {
// this.add(new JLabel("Selection:"));
// this.add(new JButton(new SelectionAction("Clear", false)));
// this.add(new JButton(new SelectionAction("Check", true)));
}
}
private class SelectionAction extends AbstractAction {
boolean value;
public SelectionAction(String name, boolean value) {
super(name);
this.value = value;
}
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < dataModel.getRowCount(); i++) {
if (selectionModel.isSelectedIndex(i)) {
dataModel.setValueAt(value, i, CHECK_COL);
}
}
}
}
public void setValueAt_Cell(String val, int row, int col) {
// TODO Auto-generated method stub
if(row>=dataModel.getRowCount()){
dataModel.addRow(new Object[] {"","","","","",false});
}
dataModel.setValueAt(val, row, col);
}
public String getValAtPos(int row,int col) {
//System.out.println(dataModel.getValueAt(row, col));
if(row>=dataModel.getRowCount()){
return null;
}
return dataModel.getValueAt(row, col).toString();
}
public int getRowCount(){
return DATA.length;
}
public boolean get_checked_row(int row){
return (boolean) dataModel.getValueAt(row, 5);
}
public void clear() {
while(dataModel.getRowCount()!=0){
for(int i=0;i<dataModel.getRowCount();i++){
dataModel.removeRow(i);
}
dataModel.fireTableRowsDeleted(0, getRowCount());
dataModel.fireTableDataChanged();
}
}
}
这是一个使用数组而不是arraylist的简单实现,并支持动态添加列(如果对代码进行细微调整,则可以动态添加行):
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Test {
public static void main(String[] argv) throws Exception {
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
model.addColumn("Header");
String[] headers = { //If you wish to separate the headers array from columns array
"Header 1",
"Header 2",
"Header 3"
};
String [][]columnData = new String[][]{
{
"Column 1.1",
"Column 1.2",
"Column 1.3"
},{
"Column 2.1",
"Column 2.2",
"Column 2.3"
},{
"Column 3.1",
"Column 3.2",
"Column 3.3"
}
};
for(int col=1;col<(columnData.length+1);col++){
model.addColumn("Col"+col);
}
for(int i=0;i<headers.length;i++){
model.addRow(new Object[] { headers[i] });
}
for(int r=0;r<columnData.length;r++){
for(int c=0;c<columnData[0].length;c++){
model.setValueAt(columnData[r][c],c,r+1);
}
}
JFrame f = new JFrame();
f.setSize(500, 300);
f.add(new JScrollPane(table));
f.setVisible(true);
}
}
您可以将数据库的数据抽取代码添加到硬编码数组中。
屏幕截图:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.