我有这个JTable:

    List<MyTuple> l= new ArrayList<>();
    l.add(new Element(1,"One"));
    l.add(new Element(2,"Two"));
    l.add(new Element(3,"Three"));
    l.add(new Element(4,"Four"));
    l.add(new Element(5,"Five"));
    l.add(new Element(6,"Six"));
    l.add(new Element(7,"Seven"));

    JScrollPane pane = new JScrollPane();
    pane.setOpaque(false);
    pane.setBorder(new EmptyBorder(0, 0, 0, 0));
    pane.setBackground(new Color(0,0,0,0));
    pane.setFont(new Font("Segoe UI Semibold", Font.PLAIN, 12));
    pane.setBounds(3, 101, 707, 297);

    MyTableModel tm=new MyTableModel(l);
    table = new MyTable(tm);
    table.setBorder(new EmptyBorder(0, 0, 0, 0));
    table.setOpaque(false);
    //table.getTableHeader().setBackground(new Color(0,0,0,0));
    table.getTableHeader().setOpaque(true);
    table.getTableHeader().setBorder(new EmptyBorder(0,0,0,0));
    table.setBackground(new Color(0,0,0,0));
    table.setFont(new Font("Segoe UI Semibold", Font.PLAIN, 12));
    table.setFillsViewportHeight(false);
    table.getTableHeader().setFont(new Font("Segoe UI Semibold", Font.PLAIN, 13));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    pane.setViewportView(table);
    pane.getViewport().setOpaque(false);
    table.setGridColor(Color.GRAY);
    table.setShowGrid(true);
    getContentPane().add(pane);


MyTuple,MyTable和MyTableModel类未设置任何自定义呈现。

这是我的表在System L&F(我真的很喜欢)下的样子:

java - Java JTable-Nimbus/System L&F的透明度-LMLPHP

这是我的桌子在Nimbus L&F下的样子(请注意添加的大矩形):

java - Java JTable-Nimbus/System L&F的透明度-LMLPHP

我希望我的桌子看起来像带有System L&F的桌子。
问题是,如果我按照自己的意愿设置一个L&F,另一个则变得丑陋,我想要一种“兼容性”,是否可以这样做?

也许使用UIManager.put()方法?

最佳答案

您忘记在viewportscrollpane周围设置边框。可能的解决方案:


pane.setViewportBorder(null);
pane.setViewportBorder(BorderFactory.createEmptyBorder());
pane.setViewportBorder(new EmptyBorder(0, 0, 0, 0));


请注意,pane.getViewport().setBorder(...)将不起作用,因为JViewport实际上没有边框,setViewportBorder只是在视口周围绘制边框。 (Reference

要使表头透明:

pane.setColumnHeader(new JViewport());
pane.getColumnHeader().setOpaque(false);

table.getTableHeader().setOpaque(false);

08-18 09:15