java - 在JTable中添加3D效果

标签 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 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);

表格看起来像这样:

enter image description here

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

enter image description here

有人知道我如何在这段代码中执行此操作吗?

最佳答案

您似乎付出了很多似乎不需要的努力(恕我直言)...

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

参见http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html

对于 JTable,它会自动将 JTableHeader 应用到 JScrollPane 的列标题区域。

Corners

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 - 在JTable中添加3D效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22543410/

相关文章:

java - 处理海量个性化数据的项目应该使用什么样的数据格式?

java - 使用 JDK 7 在 Swing 组件中消除文本锯齿

java - 使用迭代器删除条目时出现 ConcurrentModificationException

java - 非常非常粗糙的排序

java - 在 Golang 中解密在 Java 中加密的内容(没有 iv)

Java Swing 移动 java.awt.Shape

javascript - 如何垂直翻转 Three.js 纹理?

scala - 为什么我的透视图实现无法显示多维数据集的面孔?

.net - 如何在.NET中绘制3D数学模型?哪种 3D 引擎最适合有效地完成此任务?

java - 如何循环直到得到正确答案?