swing JTable求大神在我代码基础上加个鼠标悬停改变行颜色的功能

heochuan 2016-06-01 06:09:26
第一个类

import javax.swing.table.AbstractTableModel;
import java.util.List;
import java.util.Iterator;
import java.util.Vector;
import java.util.ArrayList;

public class SimpleTableModel extends AbstractTableModel{

public Vector<Vector> content = null;
private String[] title_name = null;
private int[] editColumns = null;
/**
* 构造
* @param title_name String[] 表格标题
* @param vector Vector 表格数据
* @param editColumns int[] 可编辑列数
*/
public SimpleTableModel(String[] title_name, Vector vector, int[] editColumns){
this.title_name = title_name;
this.content = vector;
this.editColumns = editColumns;
}


/**
* 添加新向量
* @param v Vector
*/
public void addRow(Vector v) {
content.add(v);
}
/**
* 添加新向量
* @param index int 索引位置
* @param v Vector
*/
public void addRow(int index, Vector v){
content.add(index, v);
}
/**
* 单行删除
* @param row int
*/
public void removeRow(int row) {
content.remove(row);
}

public void removeRow(Vector<Integer> row) {
for(int i=0;i<row.size();i++) {
content.remove(row.get(i));
}

}

/**
* 多行删除
* @param row int
* @param count int
*/
public void removeRows(int row, int count) {
for (int i = 0; i < count; i++) {
if (content.size() > row) {
content.remove(row);
}
}
}

/**
* 让表格中某些值可修改,但需要setValueAt(Object value, int row, int col)方法配合才能使修改生效
*/
public boolean isCellEditable(int rowIndex, int columnIndex) {

if (editColumns != null) {
for (int i = 0; i < editColumns.length; i++) {
if (columnIndex == editColumns[i]) {
return true;
}
}
}
return false;
}

/**
* 设置单元格值
* @param value Object 给定值
* @param row int 表格行
* @param col int 表格列
*/
public void setValueAt(Object value, int row, int col) {
content.get(row).remove(col);
content.get(row).add(col, value);
fireTableCellUpdated(row, col);
}

/**
* 设置单元格值
* @param value Object 给定值
* @param row int 表格行
* @param columnName String 指定列名
*/
public void setValueAt(Object value, int row, String columnName){
for (int col = 0; col < getColumnCount(); col++) {
if(columnName.equals(getColumnName(col))){
content.get(row).remove(col);
content.get(row).add(col, value);
fireTableCellUpdated(row, col);
break;
}
}
}
public String getColumnName(int col) {
return title_name[col];
}
public int getColumnCount() {
return title_name.length;
}
public int getRowCount() {
if(content != null){
return content.size();
}else{
return 0;
}
}
public Object getValueAt(int row, int col) {

if(content.size() > 0){
return content.get(row).get(col);
}else{
return "";
}
}
/**
* 返回数据类型
*/
public Class getColumnClass(int col) {
return getValueAt(0, col).getClass();
}

/**
* 根据表格上的id数据获取行号
* @return int
*/
public int getRowById(String id){
if(content.size() > 0){
for(int i=0;i<content.size();i++){
Vector v = content.get(i);
if(v.get(0).toString().equals(id)){
return i;
}
}
}
return -1;
}

public List getSeleIds(){
List ls = new ArrayList();
Iterator<Vector> iter = content.iterator();
while(iter.hasNext()){
Vector v = iter.next();
//System.out.println(" " + (Boolean)v.get(1));
if((Boolean)v.get(1) == true){
ls.add(v.get(0));
}
}
return ls;
}
}


第二个类

import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.util.Vector;

public class TableRolloverTest {

public static void main(String[] args) {
TableRolloverTest trt = new TableRolloverTest();

String[] title = {"第一列","第二列","第三列","第四列"};
Vector<Vector> data = new Vector<Vector>();
int[] editColumn = {};

SimpleTableModel tableModel = new SimpleTableModel(title, data, editColumn);
JTable table = new JTable(tableModel);
JScrollPane sp = new JScrollPane(table);
JFrame f = new JFrame();
f.getContentPane().add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.show();

for (int i = 0; i < 10; i++) {
Vector v = new Vector();
v.add("一" + i);
v.add("二" + i);
v.add("三" + i);
v.add("四" + i);
tableModel.addRow(v);
table.repaint();
table.revalidate();
}
}
}


我的表格是后用线程添加数据行的。
试过很多网上大神做的鼠标悬停改变行颜色的例子,我拿过来加到我自己的代码里就都不好用了,研究了一天也没研究明白怎么回事,求大神给看看是哪出的问题!
求大神给写一段鼠标移动改变行颜色的代码加到我自己的代码里,万分感谢!
...全文
316 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐先生 2016-06-08
  • 打赏
  • 举报
回复
上面已有人回复了,要用描绘器来实现。
heochuan 2016-06-06
  • 打赏
  • 举报
回复
引用 3 楼 tangxheng 的回复:
你的问题有点奇怪,一般是选中行变色,你是要鼠标在上面就变色,大概写了下。 1、表格列设置自定义外观的类


import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class RoutineColor extends DefaultTableCellRenderer {
	int mouseEnterRow = -1;
	public void setMouseEnterRowRow(int mouseEnterRow) {
		this.mouseEnterRow = mouseEnterRow;
		System.out.println("mouseEnterRow = "+mouseEnterRow);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		System.out.println("row = "+row);
		Component comp = super.getTableCellRendererComponent(table,
				value, isSelected, hasFocus, row, column);
			if(mouseEnterRow != -1 && mouseEnterRow == row){
				System.out.println("setred");
				setBackground(Color.red); //设置其它行  
			}else{
				setBackground(Color.white); //设置其它行  
			}
			
		return comp;
	}

}
2、监听鼠标事件的类

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JTable;

public class MyMouseListener extends MouseAdapter {
	JTable table;
	RoutineColor routineColor;

	public MyMouseListener(JTable table, RoutineColor routineColor) {
		this.table = table;
		this.routineColor = routineColor;
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		Point mousepoint = e.getPoint();
		routineColor.setMouseEnterRowRow(table.rowAtPoint(mousepoint));
		
		table.repaint();
		super.mouseMoved(e);
	}
}
3、最后在你原来的类里面增加了几句代码,设置自定义的外观和监听器

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TableRolloverTest {
     
    public static void main(String[] args) {
        TableRolloverTest trt = new TableRolloverTest();
         
        String[] title = {"第一列","第二列","第三列","第四列"};
        Vector<Vector> data = new Vector<Vector>();
        int[] editColumn = {};
 
        SimpleTableModel tableModel = new SimpleTableModel(title, data, editColumn);
        JTable table = new JTable(tableModel);
        
        //设置表格每列用自定义外观
        RoutineColor routineColor = new RoutineColor();
        for (int i = 1; i < table.getColumnCount(); i++) {
        	table.setDefaultRenderer(table.getColumnClass(i), routineColor);
		}
        //设置鼠标监听器
        MyMouseListener mouseListener = new MyMouseListener(table, routineColor);
        table.addMouseMotionListener(mouseListener);
        
        JScrollPane sp = new JScrollPane(table);
        JFrame f = new JFrame();
        f.getContentPane().add(sp, BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.show();
         
        for (int i = 0; i < 10; i++) {
            Vector v = new Vector();
            v.add("一" + i);
            v.add("二" + i);
            v.add("三" + i);
            v.add("四" + i);
            tableModel.addRow(v);
            table.repaint();
            table.revalidate();
        }
    }
    
}
感谢大神,上面楼上的问题 我自己解决了,现在还有一个问题,就是我的鼠标从哪一行移出的,悬停的颜色还是一直停留在那一行,我想变成,如果鼠标移出表格,就没有悬停颜色了,选中行那个不算,就只是悬停颜色。 这个能有办法解决吗?
heochuan 2016-06-06
  • 打赏
  • 举报
回复
引用 3 楼 tangxheng 的回复:
你的问题有点奇怪,一般是选中行变色,你是要鼠标在上面就变色,大概写了下。 1、表格列设置自定义外观的类


import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class RoutineColor extends DefaultTableCellRenderer {
	int mouseEnterRow = -1;
	public void setMouseEnterRowRow(int mouseEnterRow) {
		this.mouseEnterRow = mouseEnterRow;
		System.out.println("mouseEnterRow = "+mouseEnterRow);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		System.out.println("row = "+row);
		Component comp = super.getTableCellRendererComponent(table,
				value, isSelected, hasFocus, row, column);
			if(mouseEnterRow != -1 && mouseEnterRow == row){
				System.out.println("setred");
				setBackground(Color.red); //设置其它行  
			}else{
				setBackground(Color.white); //设置其它行  
			}
			
		return comp;
	}

}
2、监听鼠标事件的类

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JTable;

public class MyMouseListener extends MouseAdapter {
	JTable table;
	RoutineColor routineColor;

	public MyMouseListener(JTable table, RoutineColor routineColor) {
		this.table = table;
		this.routineColor = routineColor;
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		Point mousepoint = e.getPoint();
		routineColor.setMouseEnterRowRow(table.rowAtPoint(mousepoint));
		
		table.repaint();
		super.mouseMoved(e);
	}
}
3、最后在你原来的类里面增加了几句代码,设置自定义的外观和监听器

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TableRolloverTest {
     
    public static void main(String[] args) {
        TableRolloverTest trt = new TableRolloverTest();
         
        String[] title = {"第一列","第二列","第三列","第四列"};
        Vector<Vector> data = new Vector<Vector>();
        int[] editColumn = {};
 
        SimpleTableModel tableModel = new SimpleTableModel(title, data, editColumn);
        JTable table = new JTable(tableModel);
        
        //设置表格每列用自定义外观
        RoutineColor routineColor = new RoutineColor();
        for (int i = 1; i < table.getColumnCount(); i++) {
        	table.setDefaultRenderer(table.getColumnClass(i), routineColor);
		}
        //设置鼠标监听器
        MyMouseListener mouseListener = new MyMouseListener(table, routineColor);
        table.addMouseMotionListener(mouseListener);
        
        JScrollPane sp = new JScrollPane(table);
        JFrame f = new JFrame();
        f.getContentPane().add(sp, BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.show();
         
        for (int i = 0; i < 10; i++) {
            Vector v = new Vector();
            v.add("一" + i);
            v.add("二" + i);
            v.add("三" + i);
            v.add("四" + i);
            tableModel.addRow(v);
            table.repaint();
            table.revalidate();
        }
    }
    
}
大神你好! 你的答案基本已经解决了我的问题,太棒了! 但是现在选中行的颜色没了,选中行我还想要以前默认那样就行。 这个鼠标悬停就是另外加的,为了好看一点,炫酷一点,呵呵。 还想问个问题,就是如果表格行数很大的话,添加这个效果会不会卡,占内存什么的啊?
tangxheng 2016-06-03
  • 打赏
  • 举报
回复
你的问题有点奇怪,一般是选中行变色,你是要鼠标在上面就变色,大概写了下。 1、表格列设置自定义外观的类


import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class RoutineColor extends DefaultTableCellRenderer {
	int mouseEnterRow = -1;
	public void setMouseEnterRowRow(int mouseEnterRow) {
		this.mouseEnterRow = mouseEnterRow;
		System.out.println("mouseEnterRow = "+mouseEnterRow);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		System.out.println("row = "+row);
		Component comp = super.getTableCellRendererComponent(table,
				value, isSelected, hasFocus, row, column);
			if(mouseEnterRow != -1 && mouseEnterRow == row){
				System.out.println("setred");
				setBackground(Color.red); //设置其它行  
			}else{
				setBackground(Color.white); //设置其它行  
			}
			
		return comp;
	}

}
2、监听鼠标事件的类

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JTable;

public class MyMouseListener extends MouseAdapter {
	JTable table;
	RoutineColor routineColor;

	public MyMouseListener(JTable table, RoutineColor routineColor) {
		this.table = table;
		this.routineColor = routineColor;
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		Point mousepoint = e.getPoint();
		routineColor.setMouseEnterRowRow(table.rowAtPoint(mousepoint));
		
		table.repaint();
		super.mouseMoved(e);
	}
}
3、最后在你原来的类里面增加了几句代码,设置自定义的外观和监听器

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TableRolloverTest {
     
    public static void main(String[] args) {
        TableRolloverTest trt = new TableRolloverTest();
         
        String[] title = {"第一列","第二列","第三列","第四列"};
        Vector<Vector> data = new Vector<Vector>();
        int[] editColumn = {};
 
        SimpleTableModel tableModel = new SimpleTableModel(title, data, editColumn);
        JTable table = new JTable(tableModel);
        
        //设置表格每列用自定义外观
        RoutineColor routineColor = new RoutineColor();
        for (int i = 1; i < table.getColumnCount(); i++) {
        	table.setDefaultRenderer(table.getColumnClass(i), routineColor);
		}
        //设置鼠标监听器
        MyMouseListener mouseListener = new MyMouseListener(table, routineColor);
        table.addMouseMotionListener(mouseListener);
        
        JScrollPane sp = new JScrollPane(table);
        JFrame f = new JFrame();
        f.getContentPane().add(sp, BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.show();
         
        for (int i = 0; i < 10; i++) {
            Vector v = new Vector();
            v.add("一" + i);
            v.add("二" + i);
            v.add("三" + i);
            v.add("四" + i);
            tableModel.addRow(v);
            table.repaint();
            table.revalidate();
        }
    }
    
}
heochuan 2016-06-03
  • 打赏
  • 举报
回复
2天了 都没有swing大神吗??继续等
爱睡觉的阿狸 2016-06-02
  • 打赏
  • 举报
回复
swing真的可以先不学,企业招聘基本上不做要求的,做c/s客户端的也少。

62,628

社区成员

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

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