水平滚动 + JTable + Java

6
我查看了关于在JTable上实现水平滚动的stackoverflow问题。设置AUTO_RESIZE_OFF确实可以让我获得水平滚动条,但同时表格没有充分利用滚动窗格的整个宽度。
我阅读了一些内容,发现这是自1998年以来一直存在的bug(Oracle会修复吗?)。
我看到了一些有关覆盖方法等的建议,但都对我没用。所以,有人有答案吗?非常感谢。基本上,我需要表格自动调整大小,但在任何列名被压缩之前启用水平滚动条。
谢谢。
4个回答

6

在抱怨其他答案之后 - JXTable(在SwingX项目中)具有额外的列布局属性,

  • 如果它们的组合预期小于当前宽度,则填充水平视口(即增加列宽),并尊重autoResizeMode
  • 保持列大小为其首选大小,并在其组合首选大小大于当前宽度时显示水平滚动条

需要进行一些内部调整,因此(有偏见的我)建议使用JXTable。或者查看其代码并进行复制和粘贴 - 所有都是允许的,所有都是开源的:-)


感谢,这个方法可行。如果你想了解一些有关获取库等方面的指导,请查看下面的帖子。 - Mark

3

请查看以下链接并尝试解决问题:

http://www.daniweb.com/software-development/java/threads/29263

如何在Java中实现带有水平滚动条的JTable

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class ScrollableJTable {

    public static void main(String[] args) {
        new ScrollableJTable();
    }

    public ScrollableJTable() {
        JFrame frame = new JFrame("Creating a Scrollable JTable!");
        JPanel panel = new JPanel();
        String data[][] = {
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"},
            {"001", "vinod", "Bihar", "India", "Biology", "65", "First"},
            {"002", "Raju", "ABC", "Kanada", "Geography", "58", "second"},
            {"003", "Aman", "Delhi", "India", "computer", "98", "Dictontion"},
            {"004", "Ranjan", "Bangloor", "India", "chemestry", "90", "Dictontion"}
        };
        String col[] = {"Roll", "Name", "State", "country", "Math", "Marks", "Grade"};
        JTable table = new JTable(data, col);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        JTableHeader header = table.getTableHeader();
        header.setBackground(Color.yellow);
        JScrollPane pane = new JScrollPane(table);
        panel.add(pane);
        frame.add(panel);
        frame.pack();
//        frame.setSize(500, 200);
//        frame.setUndecorated(true);
//        frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

-1,不解决问题(即“获取水平滚动条但...”后面的部分) - kleopatra

2

以下是一些链接,希望它们没有失效。Swinglabs的下载页面在这里:

http://swinglabs.org/downloads.jsp

但在我访问该网站时,这些下载链接已经失效了(现在可能已经修复),经过一番寻找,我在他们的服务器上找到了基本的访问链接:

http://java.net/downloads/swingx/releases/1.6.2/

这就是我遇到的所有问题,只是定位库的位置。只需将.jar文件提取并添加到我的项目中,然后导入JXTable(org.jdesktop.swingx.JXTable)。

JXTable扩展了常规的JTable(请参阅文档:http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXTable.html),因此所有常规的JTable方法等仍然可用。

导入库后,只需要告诉表格水平滚动即可。

JXTable table = new JXTable(yourTableModel)
table.setHorizontalScrollEnabled(true)

Swing labs提供了一个很好的教程,解释了他们对JTable所做的所有增强功能。在这里查看教程:http://swinglabs.org/docs/components/JXTable/tutorial.jsp?step=0。希望这能帮助你,它确实帮了我很多。感谢Kleopatra指出了正确的方向。

感谢您为此付出的所有努力 - SwingX仍然受到迁移到新java.net以及托管CI和swinglabs.org的(Oracle!)服务器上脆弱基础设施的影响。 - kleopatra
哈哈,没问题。我很乐意帮忙。经常上论坛看到别人解决问题的描述非常模糊,我尽可能详细和完整地描述我的解决方法,以打破这种循环。但我也理解有些问题需要更多的篇幅来解决,这可能会阻碍某些人写出恰当的描述 :) - Mark

2

你需要正确设置TableColumn的宽度,更多信息请参见这里这里,可以在这里找到可运行的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接