Swing表格的渲染,鼠标悬浮行变色!

本人在Java Swing的开发中经过自己的研究,做到了隔行换色、表格及表头字体居中、选中行字体变色等效果,特别是鼠标悬浮在表格某行中可以使该行变色,所有代码均为原创,使用时只要new MyJTable的构造方法并且传行和列进去就可调用,现特将代码分享给大家,希望能给从事Java Swing开发的朋友及Java初学者有所帮助!

package com.library.view.dialog;

import java.util.Vector;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class MyJTable extends JTable {
 /*
  * 自定义类MyJTable,调用时只需new MyTable并将行和列传入构造方法中即可
  */
 private static final long serialVersionUID = 1L;

 static int current = -1;

 public MyJTable(final Vector rowData, Vector columnNames) {
  super(new DefaultTableModel(rowData, columnNames));
  // setAutoCreateRowSorter(true);// 调出三角块表格排序
  // setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// 添加表格下滚动条
  /*调用表格的渲染*/
  for (int i = 1; i < this.getColumnCount(); i++) {
   this.setDefaultRenderer(this.getColumnClass(i), new RoutineColor());

  }

  //给表格添加鼠标退出表格的监听,鼠标退出表格,使其颜色还原
  this.addMouseListener(new MouseAdapter() {
   @Override
   public void mouseExited(MouseEvent e) {
    for (int i = 0; i < rowData.size(); i++) {

     if (i == current) {
      setBackground(Color.yellow);
      break;
     }

    }
    setBackground(Color.black);
    current = -1;
   }

  });

  //给表格添加鼠标移动的监听,鼠标移动刷新表格颜色
  this.addMouseMotionListener(new MouseMotionAdapter() {
   public void mouseMoved(MouseEvent e) {
    Point p = e.getPoint();
    current = rowAtPoint(p);

    for (int i = 0; i < rowData.size(); i++) {

     if (i == current) {
      setBackground(Color.yellow);
      break;
     }

    }
    setBackground(Color.black);
   }
  });

  //使表格表头的字体居中,若想居左居右,只要改变其属性
  DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) this
    .getTableHeader().getDefaultRenderer();
  renderer.setHorizontalAlignment(renderer.CENTER);

 }

 //定义表格不可编辑的方法
 public boolean isCellEditable(int row, int column) {
  return false;
 }

 @Override
 public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
  DefaultTableCellRenderer tableRenderer = (DefaultTableCellRenderer) super
    .getDefaultRenderer(columnClass);

  // 设置单元格内容居中显示
  tableRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
  return tableRenderer;
 }

}

/*
 * 表格的渲染器
 */
class RoutineColor extends DefaultTableCellRenderer {

 public Component getTableCellRendererComponent(JTable table, Object value,
   boolean isSelected, boolean hasFocus, int row, int column) {
  if (row % 2 == 0) {
   // 设置偶数行的背景颜色
   setBackground(new Color(236, 246, 248));
  } else {
   // 基数行的背景颜色
   setBackground(new Color(255, 255, 255));
  }

  if (row == MyJTable.current) {
   //鼠标悬浮行的颜色
   setBackground(new Color(154,221,151));
  }

  /*继承Label类的方法, 设置table的单元格对齐方式*/
  setHorizontalAlignment((int) Component.CENTER_ALIGNMENT); // 水平居中
  setHorizontalTextPosition((int) Component.CENTER_ALIGNMENT); // 垂直居中

  // table.getTableHeader().setBackground(new Color(206, 231, 255));//设置表头的字体色
  table.setSelectionBackground(new Color(213, 235, 243));//设置选中行的背景色
  table.setSelectionForeground(new Color(247, 81, 53));//设置选中行的前景色
  return super.getTableCellRendererComponent(table, value, isSelected,
    hasFocus, row, column);
 }

 // 表格列根据内容调整大小
 public static void adjustTableColumnWidths(JTable table) {
  JTableHeader header = table.getTableHeader(); // 表头
  int rowCount = table.getRowCount(); // 表格的行数
  TableColumnModel cm = table.getColumnModel(); // 表格的列模型

  for (int i = 0; i < cm.getColumnCount(); i++) { // 循环处理每一列
   TableColumn column = cm.getColumn(i); // 第i个列对象
   int width = (int) header.getDefaultRenderer()
     .getTableCellRendererComponent(table,
       column.getIdentifier(), false, false, -1, i)
     .getPreferredSize().getWidth(); // 用表头的绘制器计算第i列表头的宽度
   for (int row = 0; row < rowCount; row++) { // 循环处理第i列的每一行,用单元格绘制器计算第i列第row行的单元格度
    int preferedWidth = (int) table.getCellRenderer(row, i)
      .getTableCellRendererComponent(table,
        table.getValueAt(row, i), false, false, row, i)
      .getPreferredSize().getWidth();
    width = Math.max(width, preferedWidth); // 取最大的宽度
   }
   column.setPreferredWidth(width + table.getIntercellSpacing().width); // 设置第i列的首选宽度
  }

  table.doLayout(); // 按照刚才设置的宽度重新布局各个列
 }
}

在我的理解中编程不仅仅是门技术,它更像一门艺术,你完全可以按照自己的思维去创造自己的程序世界!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值