JTable如何改变表的大小

CTea321 2008-08-22 04:50:26
我的代码如下:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.*;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.*;

public class ResultDisplayTable
{
protected MainFrame mainFrame;

private int rowNum;
private int i,j;
private int colNum=0;
private int[][] cellData;
private String[] columnNames;

public ResultDisplayTable(MainFrame mainFrame,int rowNum)
{
this.mainFrame=mainFrame;
this.rowNum=rowNum;
this.colNum=this.rowNum+1;
this.cellData = new int[this.rowNum][this.colNum];
this.columnNames = new String[this.colNum];
this.Table();
}

public ResultDisplayTable(MainFrame mainFrame,int rowNum,int[][] cellData)
{
this.mainFrame=mainFrame;
this.rowNum=rowNum;
this.colNum=this.rowNum+1;
this.cellData = new int[this.rowNum][this.colNum];
this.columnNames = new String[this.colNum];
this.cellData = cellData;
this.Table();
}

private JTable mainTable;
private JTable fixedTable;

private void Table()
{
for(i=0;i<this.rowNum;i++)
{
this.cellData[i][0]=i+1;
}

this.columnNames[0]="#";
for (j = 1; j < this.columnNames.length; j++)
{
this.columnNames[j] = String.valueOf(j);
}

TableModel fixedColumnModel = new DefaultTableModel()
{
public int getColumnCount()
{
return 1;
}

public String getColumnName(int column)
{
return columnNames[column];
}

public int getRowCount()
{
return cellData.length;
}

public Object getValueAt(int row, int column)
{
return cellData[row][column];
}
};

TableModel mainModel = new DefaultTableModel()
{
public int getColumnCount()
{
return columnNames.length - 1;
}

public String getColumnName(int column)
{
return columnNames[column + 1];
}

public int getRowCount()
{
return cellData.length;
}

public Object getValueAt(int row, int column)
{
return cellData[row][column + 1];
}
};

fixedTable = new JTable(fixedColumnModel);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setRowHeight(30);
fixedTable.getColumnModel().getColumn(0).setPreferredWidth(30);

DefaultTableCellRenderer dtc=new DefaultTableCellRenderer();
dtc.setBackground(new Color(207,245,254));
fixedTable.getColumnModel().getColumn(0).setCellRenderer(dtc);

mainTable = new JTable(mainModel);
mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
ListSelectionModel model = fixedTable.getSelectionModel();
mainTable.setSelectionModel(model);
mainTable.setRowHeight(30);
mainTable.getTableHeader().setFont(new Font("Arial",Font.PLAIN,18));
mainTable.getTableHeader().setBackground(new Color(207,245,254));
for(j = 0; j < this.columnNames.length-1; j++)
{
mainTable.getColumnModel().getColumn(j).setPreferredWidth(35);
}

for(i=0;i<this.rowNum;i++)
{
mainTable. getCellEditor(i,0).getTableCellEditorComponent(fixedTable,i+1,false,i,0).setFont

(new Font("Arial",Font.PLAIN,18));
}

JScrollPane scrollPane = new JScrollPane(mainTable);
Dimension fixedSize = fixedTable.getPreferredSize();

JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedSize);
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader());
scrollPane.setRowHeaderView(viewport);

this.fixedTable.repaint();
this.fixedTable.updateUI();

this.mainTable.repaint();
this.mainTable.updateUI();

this.mainFrame.add(scrollPane);
}
}


最上面两个方法是想通过传递不同的行列值,实现不同大小的表
第一个可以初始化一个表,但是使用第二个方法的时候,行值以及单元格的值(cellData)都可以传递过来,但是在表中显示不出来
我不知道是为什么,大虾们帮我看看。谢谢了
...全文
713 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
CTea321 2008-09-08
  • 打赏
  • 举报
回复
顶起来啊,好重
gloomyfish 2008-08-29
  • 打赏
  • 举报
回复
最好不要手动设置大小,让系统自动pack
CTea321 2008-08-29
  • 打赏
  • 举报
回复
表的大小可以自动pack吗?
linawasa 2008-08-27
  • 打赏
  • 举报
回复
初学者 进来看看
受教育了 谢谢!
pzy123cn 2008-08-27
  • 打赏
  • 举报
回复
我把你的MainFrame类替换成一个JFrame 直接调用没有任何问题 ,所以你还是好好看看你的MainFrame类吧
CTea321 2008-08-27
  • 打赏
  • 举报
回复
问题还没有解决,高手来看看,先谢谢了
CTea321 2008-08-25
  • 打赏
  • 举报
回复
问题应该是表的视图改变之后没有“固定”下来,拖动滚动条后Frame的外观改变了,从新按初始值绘制了表格?
CTea321 2008-08-25
  • 打赏
  • 举报
回复
不好意思哈
我看了你的测试程序
我的程序是这样的,开始初始的表的大小是50*51的
后来我打开一个文件之后,生成了一个100*101的矩阵,就是后来的表要比最开始的表大。按照你的修改,表的大小确实是变成100*101的,矩阵的内容也显示在表中。但是我拖动滚动条,显示的值就全没有了,表的大小也变成50*51的了
pzy123cn 2008-08-25
  • 打赏
  • 举报
回复
我测验了你的程序 ,这个程序片断没有问题,你看看是不是在你的mainframe类中调用ResultDisplayTable有问题
我的测验程序如下
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.*;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.table.*;
import javax.swing.*;
public class ResultDisplayTable
{
protected JFrame mainFrame ;//MainFrame mainFrame;
private int rowNum;
private int i,j;
private int colNum=0;
private int[][] cellData;
private String[] columnNames;
//public ResultDisplayTable(MainFrame mainFrame,int rowNum)
public ResultDisplayTable(javax.swing.JFrame mainFrame,int rowNum)
{
this.mainFrame=mainFrame;
this.rowNum=rowNum;
this.colNum=this.rowNum+1;
this.cellData = new int[this.rowNum][this.colNum];
this.columnNames = new String[this.colNum];
this.Table();
}
public ResultDisplayTable(JFrame mainFrame,int rowNum,int[][] cellData)
{
this.mainFrame=mainFrame;
this.rowNum=rowNum;
//this.colNum=this.rowNum+1;
this.colNum = cellData[0].length;
this.cellData = new int[this.rowNum][this.colNum];
this.columnNames = new String[this.colNum];
this.cellData = cellData;
//this.colNum = cellData[0].length;
this.Table();
}
private JTable mainTable;
private JTable fixedTable;
private void Table()
{
for(i=0;i<this.rowNum;i++)
{
this.cellData[i][0]=i+1;
}
this.columnNames[0]="#";
for (j = 1; j < this.columnNames.length; j++)
{
this.columnNames[j] = String.valueOf(j);
}
TableModel fixedColumnModel = new DefaultTableModel()
{
public int getColumnCount()
{
return 1;
}
public String getColumnName(int column)
{
return columnNames[column];
}
public int getRowCount()
{
return cellData.length;
}
public Object getValueAt(int row, int column)
{
return cellData[row][column];
}
};
TableModel mainModel = new DefaultTableModel()
{
public int getColumnCount()
{
return columnNames.length - 1;
}
public String getColumnName(int column)
{
return columnNames[column + 1];
}
public int getRowCount()
{
return cellData.length;
}
public Object getValueAt(int row, int column)
{
return cellData[row][column + 1];
}
};
fixedTable = new JTable(fixedColumnModel);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setRowHeight(30);
fixedTable.getColumnModel().getColumn(0).setPreferredWidth(30);
DefaultTableCellRenderer dtc=new DefaultTableCellRenderer();
dtc.setBackground(new Color(207,245,254));
fixedTable.getColumnModel().getColumn(0).setCellRenderer(dtc);
mainTable = new JTable(mainModel);
mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
ListSelectionModel model = fixedTable.getSelectionModel();
mainTable.setSelectionModel(model); mainTable.setRowHeight(30);
mainTable.getTableHeader().setFont(new Font("Arial",Font.PLAIN,18));
mainTable.getTableHeader().setBackground(new Color(207,245,254));
for(j = 0; j < this.columnNames.length-1; j++)
{
mainTable.getColumnModel().getColumn(j).setPreferredWidth(35);
}
for(i=0;i<this.rowNum;i++)
{
mainTable. getCellEditor(i,0).getTableCellEditorComponent(fixedTable,i+1,false,i,0).setFont (new Font("Arial",Font.PLAIN,18));
}
JScrollPane scrollPane = new JScrollPane(mainTable);
Dimension fixedSize = fixedTable.getPreferredSize();
JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedSize);
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader());
scrollPane.setRowHeaderView(viewport);
this.fixedTable.repaint();
this.fixedTable.updateUI();
this.mainTable.repaint();
this.mainTable.updateUI();
this.mainFrame.add(scrollPane);
//this.mainFrame.getComponents().Validate();
this.mainFrame.validate();
}
public static void main(String args[])
{
JFrame jf = new JFrame();
jf.setSize(600,600);
//jf.setLayuout(Borderlayout.CENTER);
jf.setVisible(true);
int CELL_DATA[][] = new int[50][3];
int i=0 ;
int j=0;
for (i=0 ; i< 50 ; i++)
{
for(j=0 ; j<3 ; j++)
{
CELL_DATA[i][j] = i*j;
}
}
//ResultDisplayTable rt = new ResultDisplayTable (jf , 5 );
ResultDisplayTable rt = new ResultDisplayTable (jf , 5 , CELL_DATA );
//rt.ResultDisplayTable(jf , 5);
}

}
CTea321 2008-08-25
  • 打赏
  • 举报
回复
pzy123cn 你好
我按你说的改了之后,虽然可以显示单元格中的值,而且也改变了表格的大小
但是我一拖动滚动条之后,单元格里的值就又都变成0,而且表格的大小也变成初始大小了,就是全变成最开始的样子了
这是怎么回事?
liu_1987 2008-08-23
  • 打赏
  • 举报
回复
挣可用分。没分了。汗
CTea321 2008-08-23
  • 打赏
  • 举报
回复
//this.colNum=this.rowNum+1;
this.colNum = cellData[0].length;

这个我把那些值打印出来的时候是正确的,比如this.rowNum是100的话,this.colNum=this.rowNum+1就是101
我试试你修改后的,先谢谢
有问题我再请教
pzy123cn 2008-08-22
  • 打赏
  • 举报
回复
还有就是我在你的 Table()方法追加了一句this.mainFrame.validate();
因为 ,你的MainFrame添加了新的组件所以validate一下 ,如果没有这个的话 在我测试你的程序时 需要拖动一下窗口才能显示数据
pzy123cn 2008-08-22
  • 打赏
  • 举报
回复
你的第二个方法在初始化你的table的colnum有错误
修改后
public ResultDisplayTable(MainFrame mainFrame,int rowNum,int[][] cellData)
{
this.mainFrame=mainFrame;
this.rowNum=rowNum;
//this.colNum=this.rowNum+1;
this.colNum = cellData[0].length;

this.cellData = new int[this.rowNum][this.colNum];
this.columnNames = new String[this.colNum];
this.cellData = cellData;
this.Table();
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧