Java 在JTable中添加3D效果

Java 在JTable中添加3D效果,java,swing,3d,jtable,Java,Swing,3d,Jtable,我使用以下代码创建了一个JTable: List<String> visibleColumns = new ArrayList<String>(); visibleColumns.add("Column 1"); visibleColumns.add("Column 2"); visibleColumns.add("Column 3"); DefaultTableModel tableModel = new DefaultTabl

我使用以下代码创建了一个JTable:

    List<String> visibleColumns = new ArrayList<String>();
    visibleColumns.add("Column 1");
    visibleColumns.add("Column 2");
    visibleColumns.add("Column 3");

    DefaultTableModel tableModel = new DefaultTableModel(visibleColumns.toArray(),100);
    JTable table = new JTable(tableModel);

    JPanel panel = new SwingPaneTable();
    panel.setBounds(0, 0, 280, 150);
    panel.setLayout(new BorderLayout());
    panel.add(table, BorderLayout.CENTER);
    panel.add(table.getTableHeader(), BorderLayout.NORTH);

    // Set Row Header
    JList<String> rowHeader = new JList<String>();
    rowHeader.setFixedCellWidth(18);
    rowHeader.setFixedCellHeight(18);
    rowHeader.setBackground(panel.getBackground());
    rowHeader.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    JScrollPane scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    scroll.setRowHeaderView(rowHeader);
    panel.add(scroll, BorderLayout.CENTER);
List visibleColumns=new ArrayList();
可见列。添加(“第1列”);
可见列。添加(“第2列”);
可见列。添加(“第3列”);
DefaultTableModel tableModel=新的DefaultTableModel(visibleColumns.toArray(),100);
JTable table=新的JTable(tableModel);
JPanel panel=新SwingPaneTable();
面板立根(0,0,280,150);
panel.setLayout(新的BorderLayout());
面板.添加(表格,边框布局.中心);
panel.add(table.getTableHeader(),BorderLayout.NORTH);
//设置行标题
JList rowHeader=新JList();
rowHeader.setFixedCellWidth(18);
行标题。设置固定单元格高度(18);
rowHeader.setBackground(panel.getBackground());
rowHeader.setboorder(UIManager.getBorder(“TableHeader.cellBorder”);
JScrollPane scroll=新的JScrollPane(表格,JScrollPane.VERTIONAL\U SCROLLBAR\U根据需要,JScrollPane.HORIONAL\U SCROLLBAR\U根据需要);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
scroll.setRowHeaderView(行标题);
panel.add(滚动、边框布局、居中);
这张桌子看起来是这样的:

现在,我需要在我的表格中添加以下效果:


有人知道我在这段代码中是如何做到这一点的?

您似乎要付出很多努力,但这似乎不是必需的(IMHO)

JScrollPane
为您提供了向滚动窗格的每个角添加角的方法,以及提供行标题和列标题

JTable
的情况下,它会自动将
JTableHeader
应用于
JScrollPane
的列标题区域

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.BevelBorder;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.border.MatteBorder;
import javax.swing.table.DefaultTableModel;

public class TableExample {

    public static void main(String[] args) {
        new TableExample();
    }

    public TableExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                List<String> visibleColumns = new ArrayList<String>();
                visibleColumns.add("Column 1");
                visibleColumns.add("Column 2");
                visibleColumns.add("Column 3");

                DefaultTableModel tableModel = new DefaultTableModel(visibleColumns.toArray(), 100);
                JTable table = new JTable(tableModel);

                JScrollPane scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

                JPanel left = new JPanel();
                left.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
                scroll.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, left);

                JPanel right = new JPanel();
                right.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
                scroll.setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, right);

                JPanel columnHeader = new JPanel() {
                    @Override
                    public Dimension getPreferredSize() {
                        JScrollBar sb = new JScrollBar(JScrollBar.VERTICAL);
                        return new Dimension(sb.getPreferredSize().width, 10);
                    }
                };
                columnHeader.setBorder(new CompoundBorder(
                        new MatteBorder(1, 1, 0, 0, Color.WHITE),
                        new MatteBorder(0, 0, 1, 1, Color.GRAY)
                ));
                scroll.setRowHeaderView(columnHeader);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(scroll);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.BorderFactory;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollBar;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.ScrollPaneConstants;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.BevelBorder;
导入javax.swing.border.CompoundBorder;
导入javax.swing.border.EtchedBorder;
导入javax.swing.border.MatteBorder;
导入javax.swing.table.DefaultTableModel;
公共类表格示例{
公共静态void main(字符串[]args){
新的TableExample();
}
公共表格示例(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
List visibleColumns=新建ArrayList();
可见列。添加(“第1列”);
可见列。添加(“第2列”);
可见列。添加(“第3列”);
DefaultTableModel tableModel=新的DefaultTableModel(visibleColumns.toArray(),100);
JTable table=新的JTable(tableModel);
JScrollPane scroll=新的JScrollPane(表格,JScrollPane.VERTIONAL\U SCROLLBAR\U根据需要,JScrollPane.HORIONAL\U SCROLLBAR\U根据需要);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JPanel left=新的JPanel();
left.setboorder(BorderFactory.createBevelOrder(BevelOrder.downed));
scroll.setCorner(ScrollPaneConstants.UPPER\u LEFT\u CORNER,LEFT);
JPanel right=新的JPanel();
右.setBordOrder(BorderFactory.createBevelOrder(BevelOrder.LOWERED));
scroll.setCorner(ScrollPaneConstants.UPPER\u RIGHT\u CORNER,RIGHT);
JPanel columnHeader=新的JPanel(){
@凌驾
公共维度getPreferredSize(){
JScrollBar sb=新的JScrollBar(JScrollBar.VERTICAL);
返回新维度(sb.getPreferredSize().width,10);
}
};
columnHeader.setBorder(新的复合边框)(
新的无光边框(1,1,0,0,颜色为白色),
新的蒙版边框(0,0,1,1,颜色为灰色)
));
scroll.setRowHeaderView(columnHeader);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(滚动);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
}

看起来像两个带斜面3d边框的空按钮。