首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获得文本在JTable单元格中所占的确切空间?

如何获得文本在JTable单元格中所占的确切空间?
EN

Stack Overflow用户
提问于 2018-08-03 02:14:41
回答 1查看 48关注 0票数 0

我在一个JScrollPane中有一个行头,我应该根据文本的最大宽度来设置它的宽度。我设法做到了这一点,但为了显示全文,我必须在对setPreferredScrollableViewportSize的调用中添加1。我的测量结果错了吗?或者这个数量是固定的?

这是主类。

代码语言:javascript
复制
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()

代码语言:javascript
复制
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));
    }  
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 06:37:29

我设法做到了,但为了显示全文,我必须在对setPreferredScrollableViewportSize的调用中添加1。我的测量结果错了吗?或者这个数量是固定的?

我认为您需要包括从表中返回的getIntercellSpacing()值。

有关确定列宽的更多信息和示例代码,请查看Table Column Adjuster

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51659906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档