我在一个JScrollPane中有一个行头,我应该根据文本的最大宽度来设置它的宽度。我设法做到了这一点,但为了显示全文,我必须在对setPreferredScrollableViewportSize的调用中添加1。我的测量结果错了吗?或者这个数量是固定的?
这是主类。
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
public class Example {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
JTable table = new JTable(5, 3);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
HeaderColumn ch = new HeaderColumn(5, 1);
JFrame frame = new JFrame();
JScrollPane sp = new JScrollPane(table);
sp.setRowHeaderView(ch);
frame.add(sp);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
ch.adjustSize();
}
});
}
}
这是头类。请看adjustSize()
。
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class HeaderColumn extends JTable{
private final int INSET = 2;
public HeaderColumn(int r, int c){
super(r,c);
}
@Override
public void columnAdded(TableColumnModelEvent e){
DefaultTableModel m = (DefaultTableModel)getModel();
int rowCount = m.getRowCount();
for(int i = 0; i < rowCount; i++){
m.setValueAt("#" + Integer.toString(i+1), i, 0);
}
TableColumn tc = getColumnModel().getColumn(e.getToIndex());
tc.setCellRenderer(new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
setText((value == null) ? "" : value.toString());
setBorder(BorderFactory.createEmptyBorder(0, INSET, 0, INSET));
return this;
}
});
}
public void adjustSize(){
FontMetrics fm = getGraphics().getFontMetrics(getTableHeader().getFont());
int maxTextWidth = 0;
DefaultTableModel m = (DefaultTableModel)getModel();
int rowCount = m.getRowCount();
for(int i = 0; i < rowCount; i ++){
int width = fm.stringWidth(m.getValueAt(i, 0).toString());
if(width > maxTextWidth){
maxTextWidth = width;
}
}
setPreferredScrollableViewportSize(new Dimension(maxTextWidth+INSET*2+1, 0));
}
}
发布于 2018-08-03 06:37:29
我设法做到了,但为了显示全文,我必须在对setPreferredScrollableViewportSize的调用中添加1。我的测量结果错了吗?或者这个数量是固定的?
我认为您需要包括从表中返回的getIntercellSpacing()
值。
有关确定列宽的更多信息和示例代码,请查看Table Column Adjuster。
https://stackoverflow.com/questions/51659906
复制相似问题