Java Swing 的问题

烟袅许伊 2014-01-15 05:45:32
首先,不知道我这个问题是不是很幼稚。
其次,不要说Swing快被淘汰了,巴拉巴拉巴拉。。。
最后,看问题。

Swing JTable 中可以添加元素,然后我想获得JTable的推荐大小,比如说,一行20,三行就会得到60。注意这个问题不是说的行高。不知道有没有API支持这个操作,如果没有API的话,我想知道JScrollPane是怎么判断其推荐高度的。

而且。。。自己算高度这个我也知道。。。
...全文
207 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
烟袅许伊 2014-01-17
  • 打赏
  • 举报
回复
引用 5 楼 shaowenxm 的回复:
JTable:得到行高:getRowHeight() 设置行高:setRowHeight 学会看API文档 ,很容易的。 还有你问题一直说”推荐大小“ ,是’默认大小‘的意思吧,用词准确可以帮你更快解决问题
问题明不明确我不知道,但是有大神看懂了,你没看懂。。。 别的我也不知道,但是我也知道,preferred不是默认的意思。。。默认应该为defaultSize。。。
O_森_O 2014-01-16
  • 打赏
  • 举报
回复
getprefereSize 一般是通过UI类或者layoutManager类来计算,同时每个Component都可能重写这个方法,table的这个方法返回值应该是由tableUI来确定的
qingtongshijiao 2014-01-16
  • 打赏
  • 举报
回复
JTable:得到行高:getRowHeight() 设置行高:setRowHeight 学会看API文档 ,很容易的。 还有你问题一直说”推荐大小“ ,是’默认大小‘的意思吧,用词准确可以帮你更快解决问题
烟袅许伊 2014-01-16
  • 打赏
  • 举报
回复
JScrollPane是通过preferredSize来确定元素的大小,以确定视图大小的吧? 可是找不到JTable关于preferredSize的设置。
烟袅许伊 2014-01-16
  • 打赏
  • 举报
回复
就是说,有没有系统API能获得JTable的最大高度。。。
kakashi8841 2014-01-16
  • 打赏
  • 举报
回复
有兴趣的你可以看看TableUI的一个子类BasicTableUI。 他的getPreferredSize方法是这样的:

    public Dimension getPreferredSize(JComponent c) {
        long width = 0;
        Enumeration enumeration = table.getColumnModel().getColumns();
        while (enumeration.hasMoreElements()) {
            TableColumn aColumn = (TableColumn)enumeration.nextElement();
            width = width + aColumn.getPreferredWidth();
        }
        return createTableSize(width);
    }
这里可以发现,他的宽度计算,就是拿出每一列,然后累加。 而最后调用的返回值:
    
    private Dimension createTableSize(long width) {
        int height = 0;
        int rowCount = table.getRowCount();
        if (rowCount > 0 && table.getColumnCount() > 0) {
            Rectangle r = table.getCellRect(rowCount-1, 0, true);
            height = r.y + r.height;
        }
        // Width is always positive. The call to abs() is a workaround for
        // a bug in the 1.1.6 JIT on Windows.
        long tmp = Math.abs(width);
        if (tmp > Integer.MAX_VALUE) {
            tmp = Integer.MAX_VALUE;
        }
        return new Dimension((int)tmp, height);
    }
这里代码主要是,计算高度,用最后一行的y加这一行的高度作为高度。然后对宽度的大小进行了限制。
kakashi8841 2014-01-16
  • 打赏
  • 举报
回复
先看看JTable的getPreferredSize是哪里来的。 JTable的继承关系如下:JTable>JComponent>Container>Component 好的,那么getPreferredSize在JTable中没有重写的,我们看看父类JComponent, 意外发现下面代码:

    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        Dimension size = null;
        if (ui != null) {
            size = ui.getPreferredSize(this);
        }
        return (size != null) ? size : super.getPreferredSize();
    }
先看看这几行代码:

if (isPreferredSizeSet()) {
    return super.getPreferredSize();
}
if是否通过呢,isPreferredSizeSet是Component中的代码,可以发现它仅在你调用setPreferredSize的时候,而且传入一个非空的Dimension才会被设置为true。 OK。如果你没有设置这个值,那么,应该是继续往下看。

ui.getPreferredSize(this);
那这个UI指的是什么呢? 在JTable的构造方法中,我们有意外发现它调用了一个updateUI的方法。

updateUI();
那updateUI方法中,到底有什么秘密呢?我们可以看到这一行代码:

 setUI((TableUI)UIManager.getUI(this));
他是从UIManager中取了一个TableUI。而UIManager中是通过组件的UIClassID和类加载器,从LookAndFeel来获取UI的。 上面所有,通俗的说就是,当你没有调用JTable的setPreferredSize时,它是通过TableUI来计算大小的。
zqfddqr 2014-01-15
  • 打赏
  • 举报
回复
楼主妹纸? 你确实没有表述清楚你的需求, 我猜你是在 JTable 的行数不固定 所以JScrollPane 高度不会算了是么.
teemai 2014-01-15
  • 打赏
  • 举报
回复
没太明白你的问题

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧