Java JTable行头实现

Java JTable行头实现,java,swing,jtable,Java,Swing,Jtable,如何创建具有行标题的JTable 这个问题似乎很简单,我可以在谷歌搜索中找到很多提示。然而,我所发现的一切都是如何制作一个模仿真实标题的专栏的技巧。虽然这很好,但它也带来了一个问题,即外观和感觉不能很好地应用。要解决我的问题,我只需将一个标题作为渲染器返回到行标题,该标题已经包含了我想要的标题。让我解释一下,我创建了一个带有标题的表,获取标题并将其作为渲染器返回 谢谢! Leandro试试这个。该代码是从这里和那里,但它的工作相当好 它是一个JTable,具有可重定尺寸的rowHeader(在标

如何创建具有行标题的JTable


这个问题似乎很简单,我可以在谷歌搜索中找到很多提示。然而,我所发现的一切都是如何制作一个模仿真实标题的专栏的技巧。虽然这很好,但它也带来了一个问题,即外观和感觉不能很好地应用。

要解决我的问题,我只需将一个标题作为渲染器返回到行标题,该标题已经包含了我想要的标题。让我解释一下,我创建了一个带有标题的表,获取标题并将其作为渲染器返回

谢谢!
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;
    }
}