关键字:Java ,SWING,JTable,UI,图文混排,
项目需要用SWING,所以进行了简单的研究。现将成果简单说明,希望能够对各位有所帮助。 MVC模型:
详细使用Java的各位对于MVC模型应该不会陌生。Java的Swing,在设计之初,就全面按照,MVC模型的标准设计自己的组件。Swing的任何一个组件,都可以很方便的应用MVC模型的概念对其进行用户自定义的改造。 JTable 改造后的效果。
1, 每行每个单元格的前景色和背景色都可以变化。 2, 每个单元格都可以插入图片。
如
图:
第一步,实现TableCellRenderer
接口javax.swing.table.TableCellRenderer定义了要成为JTable中单元格渲染器的任意对象所需的方法。当JTable每次重绘,都会调用该接口的实例。 其中方法Component getTableCellRendererComponent(JTable
table,Object value,Boolean isSelected,Boolean hasFocus,int row,int column)就是绘制每个单元格的函数。 参数:
table - 要求渲染器绘制的 JTable;可以为 null
value - 要呈现的单元格的值。由具体的渲染器解释和绘制该值。例如,如果 value 是字符串 \"true\",则它可呈现为字符串,或者也可呈现为已选中的复选框。null 是有效值
isSelected - 如果使用选中样式的突出显示来呈现该单元格,则为 true;否则为 false hasFocus - 如果为 true,则适当地呈现单元格。例如,在单元格上放入特殊的边框,如果可以编辑该单元格,则以彩色呈现它,用于指示正在进行编辑 row - 要绘制的单元格的行索引。绘制头时,row 值是 -1 column - 要绘制的单元格的列索引
我们的重点就是实现这个函数。(稍后看代码) 第二步,创建一个TableModel继承AbstractTableModel
我们为什么要创建一个TableModel呢?因为根据MVC的模型,用户的数据部分是和“实现”“表示”分离的。即,我们想在JTable上表示什么内容,和如何表示这些内容,是和JTable本身无关的,因此我们需要单独保存这些信息。这些信息被保存在MVC模型的M中。JTable的M部分的一个基类就是 javax.swing.table.AbstractTableModel
此抽象类为 MyTableModel 接口中的大多数方法提供默认实现。它负责管理侦听器,并为生成 TableModelEvents 以及将其调度到侦听器提供方便。要创建一个具体的 TableModel 作为 AbstractTableModel 的子类,只需提供对以下三个方法的实现:
public int getRowCount(); public int getColumnCount();
public Object getValueAt(int row, int column);
我们都需要MyTableModel中保存那些信息呢?最主要的就是某行某列的单元格是什么样子,和装载的什么值。
为此我们定义一个类TableCellModel。 publicclass TableCellModel { /*cell的宽度*/
privateintwidth = 0;
/*cell中的数据,可以使String 或 ImageIcon等等*/ private Object data = null; /*cell的颜色*/
private Color cellColor = null; /*cell的背景色*/
private Color cellBackgroundColor = null;
/*首行cell的颜色(用于表格的行交替颜色变化)*/ private Color cellFirstBackgroundColor = null;
/**获得Cell颜色 * */
public Color getCellColor() { returncellColor; }
/**cell颜色设置 * */
publicvoid setCellColor(Color cellColor) { this.cellColor = cellColor; }
/**获得Cell的数据 * */
public Object getData() { returndata; }
/**设置Cell的数据 * */
publicvoid setData(Object data) { this.data = data; }
/**获得Cell的宽度 * */
publicint getWidth() { returnwidth; }
/**设置Cell的宽度 * */
publicvoid setWidth(int width) { this.width = width; }
/**获得Cell的背景色 * */
public Color getCellBackgroundColor() { returncellBackgroundColor; }
/**设置Cell的背景色 * */
publicvoid setCellBackgroundColor(Color cellBackgroundColor) { this.cellBackgroundColor = cellBackgroundColor; }
/**获得Cell首行的背景色 * */
public Color getCellFirstBackgroundColor() { returncellFirstBackgroundColor;
}
/**设置Cell的首行背景色 * */
publicvoid setCellFirstBackgroundColor(Color cellFirstBackgroundColor) { this.cellFirstBackgroundColor = cellFirstBackgroundColor; }
}
TableCellModel将会以List的形式组织好后,赴值给MyTableModle。 MyTableModle的概要代码如下:
publicclassMyTableModel extends AbstractTableModel { /*行是否能够被选择(代码不详细写了,比较简单)*/
private List canBeSelectedModel= null;
private List tableCellModel = null; /*行数*/
privateintrowNumber = 0; /*列数*/
privateintcolNumber = 0; /*行背景色*/
private Color rowBackgroundColor = null; /*首行背景色*/
private Color firstRowBackgroundColor = Color.white; privateintdiv = 1;
/*每个单元格的对齐方式(代码不详细写了,比较简单)*/ private List cellLayout = null; /*偏移量(没有用到)*/ privateintoffSet = 0; privateinteditColNo = -1; /*可编辑的前景色*/
private Color editColForeground = null; /*可编辑的背景色*/
private Color editColBackground = null; public Color getEditColBackground() { returneditColBackground; }
publicvoid setEditColBackground(Color editColBackground) { this.editColBackground = editColBackground; }
public Color getEditColForeground() { returneditColForeground; }
publicvoid setEditColForeground(Color editColForeground) { this.editColForeground = editColForeground;
}
publicint getEditColNo() { returneditColNo; }
publicvoid setEditColNo(int editColNo) { this.editColNo = editColNo; }
publicvoid setCellLayout(List cellLayout) { this.cellLayout = cellLayout; }
publicint getRow() { returnrowNumber; }
publicint getRowCount() { returnrowNumber; }
publicint getColumnCount() { return 1; }
publicint getCol() { returncolNumber; }
publicvoid setCol(int col) { this.colNumber = col; }
publicvoid setRow(int row) { this.rowNumber = row; }
public List getTableCellModel() { returntableCellModel; }
publicvoid setTableCellModel(List tableCellModel) { this.tableCellModel = tableCellModel; }
public Color getColor(int row, int col) { if((row+offSet) < rowNumber){ row= row+offSet; }else{
row = rowNumber-1; }
List rowData = (List)tableCellModel.get(row);
TableCellModel cellModel = (TableCellModel)rowData.get(col); return cellModel.getCellColor(); }
public Color getCellBackgroundColor(int row, int col) { if((row+offSet) < rowNumber){ row= row+offSet; }else{
row = rowNumber-1; }
List rowData = (List)tableCellModel.get(row);
TableCellModel cellModel = (TableCellModel)rowData.get(col); return cellModel.getCellBackgroundColor(); }
public Color getCellFirstBackgroundColor(int row, int col) { if((row+offSet) < rowNumber){ row= row+offSet; }else{
row = rowNumber-1; }
List rowData = (List)tableCellModel.get(row);
TableCellModel cellModel = (TableCellModel)rowData.get(col); return cellModel.getCellFirstBackgroundColor(); }
publicint getCellLayout(int col) {
return (Integer)cellLayout.get(col); }
publicint getWidth(int row, int col) { if((row+offSet) < rowNumber){ row= row+offSet; }else{
row = rowNumber-1; }
if(tableCellModel != null){
List rowData = (List)tableCellModel.get(row); if(rowData.size() <= col){ return 1; }else{
TableCellModel cellModel = (TableCellModel)rowData.get(col);
return cellModel.getWidth(); } } return 1;
}
public Object getValueAt(int row, int col) { if((row+offSet) < rowNumber){ row= row+offSet; }else{
row = rowNumber-1; }
if(tableCellModel != null){
List rowData = (List)tableCellModel.get(row); if(rowData.size() <= col){
returnnull; }else{
TableCellModel cellModel = (TableCellModel)rowData.get(col);
return cellModel.getData(); } }
returnnull;
//return
((TableCellModel)((List)tableCellModel.get(row)).get(col)).getData(); }
public Color getRowBackgroundColor() { returnrowBackgroundColor; }
publicvoid setRowBackgroundColor(Color rowBackgroundColor) { this.rowBackgroundColor = rowBackgroundColor; }
publicint getOffSet() { returnoffSet; }
publicvoid setOffSet(int offSet) { this.offSet = offSet; }
public Color getFirstRowBackgroundColor() { returnfirstRowBackgroundColor; }
publicvoid setFirstRowBackgroundColor(Color firstRowBackgroundColor) { this.firstRowBackgroundColor = firstRowBackgroundColor; }
publicint getDiv() { returndiv; }
publicvoid setDiv(int div) { this.div = div; }
public List getCanBeSelectedModel() { returncanBeSelectedModel; }
publicvoid setCanBeSelectedModel(List canBeSelectedModel) { this.canBeSelectedModel = canBeSelectedModel; } }
下面是最关键的JTableCellRenderer代码
publicclass JTableCellRenderer extends JPanel implements TableCellRenderer{ private JComponent[] component = null;
privatestaticfinallongserialVersionUID = 48144116385836965L; /*透明?*/
privatebooleanisOpaque = true;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
/*透明?*/
isOpaque = table.isOpaque(); /*获得TableModel*/
MyTableModel myTableModel = (MyTableModel)table.getModel();
boolean canSelected = true;
List canSelectedList = myTableModel.getCanBeSelectedModel(); if(canSelectedList != null){ if(row < canSelectedList.size()){
if(!((Boolean)canSelectedList.get(row)).booleanValue()){ canSelected = false; } }else{
canSelected = false; } }
/*设定用于显示Cell的panel*/ JPanel cellPanel = new JPanel(); /*绘制Cell*/
getCell(table,cellPanel,row,canSelected,isSelected);
int colorChangeFlag = row/myTableModel.getDiv(); /*是否透明*/ if(isOpaque){
if(colorChangeFlag % 2 == 0){
cellPanel.setBackground(myTableModel.getRowBackgroundColor());
}else{
cellPanel.setBackground(myTableModel.getFirstRowBackgroundColor()); } }
/*设定是否透明 */
cellPanel.setOpaque(isOpaque);
if(isSelected){
cellPanel.setBackground(table.getSelectionBackground()); }
rePaintComponents();
// MainRun.middlePanel.repaint(); return cellPanel; }
privatevoid getCell(JTable table,JPanel cellPanel,int row, boolean canSelected,boolean isSelected){
/*设定对齐方式*/
cellPanel.setLayout(new FlowLayout(0,0,0)); /*获得TableModel*/
MyTableModel myTableModel = (MyTableModel)table.getModel(); /*获得列数*/
int col = myTableModel.getCol();
for(int i = 0; i < col ; i++ ){ /*获得某个单元格*/
Object cellObject = myTableModel.getValueAt(row,i); /**/
JComponent tempLabel = null; /*String*/
if(cellObject instanceof String){
tempLabel = new JLabel((String)cellObject); if(canSelected){
Color cellColor = myTableModel.getColor(row,i); tempLabel.setForeground(cellColor); }else{
tempLabel.setForeground(Color.gray); }
if(isSelected){
tempLabel.setForeground(table.getSelectionForeground()); } /*Icon*/
}elseif(cellObject instanceof ImageIcon){ tempLabel = new JLabel((ImageIcon)cellObject); /*TextBox*/
}elseif(cellObject instanceof JTextField){ tempLabel = new JTextField(); }else{
tempLabel = new JLabel(); }
if(cellObject instanceof JTextField){ }else{
/*对齐方式*/
switch(myTableModel.getCellLayout(i)){ /*左*/ case 0:
((JLabel)tempLabel).
setHorizontalAlignment(JLabel.LEFT); break; /*中*/ case 1:
((JLabel)tempLabel).
setHorizontalAlignment(JLabel.CENTER); break; /*右*/ case 2:
((JLabel)tempLabel).
setHorizontalAlignment(JLabel.RIGHT); break; } }
/*宽度设定*/
int width = myTableModel.getWidth(row,i); /*size设定*/
tempLabel.setPreferredSize
(new Dimension(width,table.getRowHeight())); /*字体设定*/
tempLabel.setFont(table.getFont());
/*设定是否透明*/
cellPanel.add(tempLabel);
} }
protectedvoid rePaintComponents(){ if (component != null) {
for (int i = 0; i < component.length; i++) { if (component[i] != null) { component[i].repaint(); } } } }
public JComponent[] getComponent() { returncomponent; }
publicvoid setComponent(JComponent[] component) { this.component = component; } }
下面看看如何使用
private JPanel makeTable(){ JPanel panel =new JPanel(); panel.setBounds(0, 100, 100, 200);
MyTableModel myTableModel = newMyTableModel();
ArrayList data = new ArrayList(); int rowNumber = 100;
ArrayList cellLayout = new ArrayList(); /*Row*/
for(int row=0;row tableCellModel.setWidth(50); tableCellModel.setCellColor(Color.black); dataRowList.add(0,tableCellModel); }else{ TableCellModel tableCellModel = new TableCellModel(); tableCellModel.setData(\"AAA\"); tableCellModel.setWidth(50); tableCellModel.setCellColor(Color.black); dataRowList.add(0,tableCellModel); } TableCellModel tableCellModel1 = new TableCellModel(); tableCellModel1.setData(\"adfadf\"+row); tableCellModel1.setWidth(70); tableCellModel1.setCellColor(Color.orange); if(row > 6 && row <9){ tableCellModel1.setCellColor(Color.red); } dataRowList.add(1,tableCellModel1); TableCellModel imageCellModel = new TableCellModel(); imageCellModel.setData(new ImageIcon(\"image/LOCK.jpg\")); imageCellModel.setWidth(20); dataRowList.add(2,imageCellModel); data.add(row,dataRowList); } for(int col=0;col<3;col++){ cellLayout.add(col,new Integer(0)); } myTableModel.setCol(3); myTableModel.setRow(rowNumber); myTableModel.setTableCellModel(data); myTableModel.setCellLayout(cellLayout); myTableModel.setRowBackgroundColor(Color.white); myTableModel.setDiv(2); myTableModel.setRowBackgroundColor(Color.BLUE); /*test RCSTableCellRenderer*/ myTableModel.setRowBackgroundColor(Color.white); myTableModel.setFirstRowBackgroundColor(Color.cyan); myTableModel.setEditColNo(1); myTableModel.setEditColBackground(Color.blue); myTableModel.setEditColForeground(Color.white); JTable table = new JTable(myTableModel); //重要的一句 table.setDefaultRenderer(Object.class, new JTableCellRenderer()); ScrollPaneExtend scrollPane = new ScrollPaneExtend(table); JScrollPane scrollpane = new JScrollPane(table); scrollpane.setBounds(0, 0, 100, 200); panel.add(scrollpane); panel.add(scrollPane); return panel; }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务