简体   繁体   English

更改 JTable 标题高度

[英]Changing JTable header height

Happy new year everyone, i've a problem chaning the height of a JTable header, I appreciate if someone can help.大家新年快乐,我在更改 JTable 标头的高度时遇到了问题,如果有人能提供帮助,我将不胜感激。 The Method I'am using is changing also the backgroundcolor etc. Thanks我正在使用的方法也在改变背景颜色等。谢谢

public static void ChangeJTableBackgroundColor(JTable InTable){
    JTable mytable = InTable;
    Color mycolor = new Color(248, 201, 171);
    mytable.setOpaque(true);
    mytable.setFillsViewportHeight(true);
    mytable.setBackground(mycolor);
    Color mycolorhead = new Color(249, 168, 117);
    mytable.getTableHeader().setBackground(mycolorhead);
    mytable.getTableHeader().setPreferredSize(new Dimension(1,50)); 

 }

There are lots of ways you "might" increase the height of the header, which you choose will depend on what you want to achieve.您“可能”增加页眉高度的方法有很多,您选择哪种方法取决于您想要实现的目标。 One thing to keep in mind though, is trying to find a solution which respects the diverse rendering environments which you program might need to run in.不过要记住一件事,就是尝试找到一种解决方案,该解决方案尊重您的程序可能需要在其中运行的各种渲染环境。

You could...你可以...

Simple change the font size.简单的改变字体大小。 This might sound silly, but you'd be surprised at how simple it really is, for example...这听起来可能很愚蠢,但您会惊讶于它实际上是多么简单,例如……

DefaultTableModel model = new DefaultTableModel(10, 10);
JTable table = new JTable(model);
JTableHeader header = table.getTableHeader();
header.setFont(header.getFont().deriveFont(30f));

字体大小

You could...你可以...

Take advantage of Swing's inbuilt HTML support.利用 Swing 的内置 HTML 支持。 This example sets up a HTML table with a defined cell height此示例设置一个具有已定义单元格高度的 HTML 表格

DefaultTableModel model = new DefaultTableModel(10, 10);
JTable table = new JTable(model);
TableColumnModel columnModel = table.getColumnModel();

String prefix = "<html><body><table><tr><td height=100>";
String suffix = "</td></tr></table></body><html>";
for (int col = 0; col < columnModel.getColumnCount(); col++) {
    TableColumn column = columnModel.getColumn(col);
    String text = prefix + Character.toString((char)('A' + col)) + suffix;
    System.out.println(text);
    column.setHeaderValue(text);
}

HTML

You could...你可以...

Just supply your own TableCellRenderer as the default cell renderer for the table header.只需提供您自己的TableCellRenderer作为表头的默认单元格渲染器。 This is a little tricky, as it's difficult to mimic the default renderer used by the current look and feel and the UIManager doesn't help.这有点棘手,因为很难模仿当前外观使用的默认渲染器,而且UIManager也无济于事。 Instead, you need to consider using a "proxy" approach, where by you apply the changes you need to the existing header renderer instead.相反,您需要考虑使用“代理”方法,在这种方法中,您可以将所需的更改应用于现有的标头渲染器。

DefaultTableModel model = new DefaultTableModel(10, 10);
JTable table = new JTable(model);
JTableHeader header = table.getTableHeader();
TableCellRenderer proxy = header.getDefaultRenderer();
header.setDefaultRenderer(new TableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = proxy.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel) comp;
            label.setBorder(new CompoundBorder(label.getBorder(), new EmptyBorder(50, 0, 50, 0)));
        }
        return comp;
    }
});

渲染器

As far as solutions go, this is probably my preferred, as it takes into account more of the variables involved in determine the preferred size of the column header itself就解决方案而言,这可能是我的首选,因为它考虑了更多涉及确定列标题本身的首选大小的变量

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.table.*;

public class TableHeaderHeightTest {
  private static int HEADER_HEIGHT = 32;
  private JTable makeTable() {
    JTable table = new JTable(new DefaultTableModel(2, 20));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    return table;
  }
  public JComponent makeUI() {
    JPanel p = new JPanel(new GridLayout(2,1));

    JTable table1 = makeTable();
    //Bad: >>>>
    JTableHeader header = table1.getTableHeader();
    //Dimension d = header.getPreferredSize();
    //d.height = HEADER_HEIGHT;
    //header.setPreferredSize(d); //addColumn case test
    header.setPreferredSize(new Dimension(100, HEADER_HEIGHT));
    p.add(makeTitledPanel("Bad: JTableHeader#setPreferredSize(...)", new JScrollPane(table1)));
    //<<<<

    JTable table2 = makeTable();
    JScrollPane scroll = new JScrollPane(table2);
    scroll.setColumnHeader(new JViewport() {
      @Override public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        d.height = HEADER_HEIGHT;
        return d;
      }
    });
//         //or
//         table2.setTableHeader(new JTableHeader(table2.getColumnModel()) {
//             @Override public Dimension getPreferredSize() {
//                 Dimension d = super.getPreferredSize();
//                 d.height = HEADER_HEIGHT;
//                 return d;
//             }
//         });
    p.add(makeTitledPanel("Override getPreferredSize()", scroll));

    final List<JTable> list = Arrays.asList(table1, table2);

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(p);
    panel.add(new JButton(new AbstractAction("addColumn") {
      @Override public void actionPerformed(ActionEvent e) {
        for(JTable t: list) {
          t.getColumnModel().addColumn(new TableColumn());
          JTableHeader h = t.getTableHeader();
          Dimension d = h.getPreferredSize();
          System.out.println(d);
        }
      }
    }), BorderLayout.SOUTH);
    panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    return panel;
  }
  private static JComponent makeTitledPanel(String title, JComponent c) {
    JPanel p = new JPanel(new BorderLayout());
    p.add(c);
    p.setBorder(BorderFactory.createTitledBorder(title));
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new TableHeaderHeightTest().makeUI());
    f.setSize(320, 320);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

Try this试试这个

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM