Java JTable行头实现
如何创建具有行标题的JTableJava JTable行头实现,java,swing,jtable,Java,Swing,Jtable,如何创建具有行标题的JTable 这个问题似乎很简单,我可以在谷歌搜索中找到很多提示。然而,我所发现的一切都是如何制作一个模仿真实标题的专栏的技巧。虽然这很好,但它也带来了一个问题,即外观和感觉不能很好地应用。要解决我的问题,我只需将一个标题作为渲染器返回到行标题,该标题已经包含了我想要的标题。让我解释一下,我创建了一个带有标题的表,获取标题并将其作为渲染器返回 谢谢! Leandro试试这个。该代码是从这里和那里,但它的工作相当好 它是一个JTable,具有可重定尺寸的rowHeader(在标
这个问题似乎很简单,我可以在谷歌搜索中找到很多提示。然而,我所发现的一切都是如何制作一个模仿真实标题的专栏的技巧。虽然这很好,但它也带来了一个问题,即外观和感觉不能很好地应用。要解决我的问题,我只需将一个标题作为渲染器返回到行标题,该标题已经包含了我想要的标题。让我解释一下,我创建了一个带有标题的表,获取标题并将其作为渲染器返回 谢谢!
Leandro试试这个。该代码是从这里和那里,但它的工作相当好 它是一个JTable,具有可重定尺寸的rowHeader(在标题行之间拖动鼠标以调整大小,与列一样) 它需要一个图像路径来显示重新绘制的大小(效果很好) 这是密码 导入javax.swing。; 导入javax.swing.event.MouseInputAdapter; 导入javax.swing.table.DefaultTableCellRenderer; 导入javax.swing.table.JTableHeader; 导入javax.swing.table.TableColumn; 导入java.awt。; 导入java.awt.event.MouseEvent; 导入java.io.File; 导入java.util.Vector /** *可重定尺寸 *用户:阿尔贝托 *日期:2013年1月23日 *时间:1时04分 */ 公共类JTableRowHeader{
私有静态最终字符串COL\u IMAGE=“IMAGE”;
专用静态最终整数最小行高=12;
公共静态void main(字符串[]args){
JFrame=新JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
字符串文件名=args[0];
if(新文件(文件名).exists()){
System.out.println(“提供图像的路径”);
}
最终JTable表=新JTable(新对象[][]{
{文件名,文件名,5.5}
,{filename,null,7}
,{“无”,空,12}
,新对象[]{“文件”,列图像,“编号”});
JScrollPane scrollPane=新的JScrollPane(表);
JPanel panel=newjpanel(newborderlayout());
panel.add(滚动窗格,BorderLayout.CENTER);
TableColumn column=table.getColumn(COL_IMAGE);
setCellRenderer(新的DefaultTableCellRenderer(){
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
if(值!=null){
ImageIcon image=新的ImageIcon(value.toString());
设置图标(图像);
}否则{
设置图标(空);
}
设置水平对齐(标记中心);
归还这个;
}
});
表.设置行高(0,200);
setRowHeaderView(buildRowHeader(表));
frame.getContentPane().add(面板);
frame.setPreferredSize(新尺寸(400400));
frame.pack();
frame.setVisible(true);
}
专用静态JList buildRowHeader(最终JTable表){
最终向量头=新向量();
对于(int i=0;i12 | | inc>0){
int rowHeight=Math.max(最小行高,oldRowHeight+inc);
表.设置行高(索引,行高);
if(rowHeader.getModel().getSize()>index+1){
int rowHeight1=table.getRowHeight(索引+1)-inc;
rowHeight1=数学最大值(12,rowHeight1);
表.设置行高(索引+1,行高1);
}
}
}
oldY=y;
}
}
私有布尔值isResizeCursor(){
重新
$ java JTableRowHeader /path/to/image.gif
import javax.swing.;
import javax.swing.event.MouseInputAdapter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import java.awt.;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Vector;
/**
* JTable redimensionable
* User: alberto
* Date: 23/01/13
* Time: 1:04
*/
public class JTableRowHeader {
private static final String COL_IMAGE = "Image";
private static final int MIN_ROW_HEIGHT = 12;
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
String filename = args[0];
if (new File(filename).exists()) {
System.out.println("Provide the path of an image");
}
final JTable table = new JTable(new Object[][]{
{filename, filename, 5.5}
, {filename, null, 7}
, {"nothing", null, 12}}
, new Object[]{"File", COL_IMAGE, "Number"});
JScrollPane scrollPane = new JScrollPane(table);
JPanel panel = new JPanel(new BorderLayout());
panel.add(scrollPane, BorderLayout.CENTER);
TableColumn column = table.getColumn(COL_IMAGE);
column.setCellRenderer(new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
ImageIcon image = new ImageIcon(value.toString());
setIcon(image);
} else {
setIcon(null);
}
setHorizontalAlignment(JLabel.CENTER);
return this;
}
});
table.setRowHeight(0, 200);
scrollPane.setRowHeaderView(buildRowHeader(table));
frame.getContentPane().add(panel);
frame.setPreferredSize(new Dimension(400, 400));
frame.pack();
frame.setVisible(true);
}
private static JList buildRowHeader(final JTable table) {
final Vector<String> headers = new Vector<String>();
for (int i = 0; i < table.getRowCount(); i++) {
headers.add(String.valueOf((char) (i + 65)).toUpperCase());
}
ListModel lm = new AbstractListModel() {
public int getSize() {
return headers.size();
}
public Object getElementAt(int index) {
return headers.get(index);
}
};
final JList rowHeader = new JList(lm);
rowHeader.setOpaque(false);
rowHeader.setFixedCellWidth(50);
MouseInputAdapter mouseAdapter = new MouseInputAdapter() {
Cursor oldCursor;
Cursor RESIZE_CURSOR = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
int index = -1;
int oldY = -1;
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
}
@Override
public void mouseMoved(MouseEvent e) {
super.mouseMoved(e);
int previ = getLocationToIndex(new Point(e.getX(), e.getY() - 3));
int nexti = getLocationToIndex(new Point(e.getX(), e.getY() + 3));
if (previ != -1 && previ != nexti) {
if (!isResizeCursor()) {
oldCursor = rowHeader.getCursor();
rowHeader.setCursor(RESIZE_CURSOR);
index = previ;
}
} else if (isResizeCursor()) {
rowHeader.setCursor(oldCursor);
}
}
private int getLocationToIndex(Point point) {
int i = rowHeader.locationToIndex(point);
if (!rowHeader.getCellBounds(i, i).contains(point)) {
i = -1;
}
return i;
}
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
if (isResizeCursor()) {
rowHeader.setCursor(oldCursor);
index = -1;
oldY = -1;
}
}
@Override
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
if (isResizeCursor() && index != -1) {
int y = e.getY();
if (oldY != -1) {
int inc = y - oldY;
int oldRowHeight = table.getRowHeight(index);
if (oldRowHeight > 12 || inc > 0) {
int rowHeight = Math.max(MIN_ROW_HEIGHT, oldRowHeight + inc);
table.setRowHeight(index, rowHeight);
if (rowHeader.getModel().getSize() > index + 1) {
int rowHeight1 = table.getRowHeight(index + 1) - inc;
rowHeight1 = Math.max(12, rowHeight1);
table.setRowHeight(index + 1, rowHeight1);
}
}
}
oldY = y;
}
}
private boolean isResizeCursor() {
return rowHeader.getCursor() == RESIZE_CURSOR;
}
};
rowHeader.addMouseListener(mouseAdapter);
rowHeader.addMouseMotionListener(mouseAdapter);
rowHeader.addMouseWheelListener(mouseAdapter);
rowHeader.setCellRenderer(new RowHeaderRenderer(table));
rowHeader.setBackground(table.getBackground());
rowHeader.setForeground(table.getForeground());
return rowHeader;
}
static class RowHeaderRenderer extends JLabel implements ListCellRenderer {
private JTable table;
RowHeaderRenderer(JTable table) {
this.table = table;
JTableHeader header = this.table.getTableHeader();
setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(CENTER);
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
setDoubleBuffered(true);
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText((value == null) ? "" : value.toString());
setPreferredSize(null);
setPreferredSize(new Dimension((int) getPreferredSize().getWidth(), table.getRowHeight(index)));
//trick to force repaint on JList (set updateLayoutStateNeeded = true) on BasicListUI
list.firePropertyChange("cellRenderer", 0, 1);
return this;
}
}