【问题标题】:Horizontal scrollbar is not working with JTable in Java Swing水平滚动条不适用于 Java Swing 中的 JTable
【发布时间】:2014-10-23 13:17:15
【问题描述】:

我有一个JTable,我将其传递给JScrollPane。垂直滚动条显示出来并且工作良好,但水平滚动条不工作。我提供的代码是可编译的,只需将您的路径放在InputFile1 字符串中并在该位置创建一个长文件。

我尝试了许多解决方案,但没有任何效果。我有一个只有一列的表,该列包含文档中的行。我需要垂直和水平滚动条。请提出一些解决方案。

其他尝试:

案例1

tab.setPreferredSize(new Dimension(400,400));

如果我设置这个,垂直滚动条不起作用。

案例2:

tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

如果我设置这个,列宽会变得非常小。如果我尝试让它更大,那么它也不起作用,只显示一个水平滚动条但没有视口。

您可以取消注释并检查它们。

代码:

public class tablecreate extends JFrame implements ActionListener 
{

    JPanel mainPanel;
    tablecreate() throws IOException
    {

        mainPanel=new JPanel();
        String InputFile1 = "/home/user/Desktop/a.txt";
        BufferedReader breader1 = new BufferedReader(new FileReader(InputFile1));
        String line1 = "";
        line1 = breader1.readLine();
        DefaultTableModel model1 = new DefaultTableModel();
        JTable tab=new JTable(model1);
        model1.addColumn("line"); 
        while((line1=breader1.readLine()) != null)
         {
             System.out.println(line1);
             model1.addRow(new Object[]{line1});
         }
         breader1.close();
         tab.setPreferredScrollableViewportSize(new Dimension(1,1));
         tab.setVisible(true);
        //tab.setPreferredSize(new Dimension(400,400));
        // tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

         JScrollPane js = new JScrollPane(tab,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
         js.setPreferredSize(new Dimension(400,400));
         mainPanel.setPreferredSize(new Dimension(500, 500));
         mainPanel.setSize(500,500);
         mainPanel.add(js);
         this.add(mainPanel);
    }

    public static void main(String[] args) throws IOException
    {
        tablecreate tc=new tablecreate();
        tc.setSize(500,500);
        tc.setVisible(true);
        tc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub          
    }       
}

【问题讨论】:

    标签: java swing jtable jscrollpane


    【解决方案1】:

    你需要使用:

    table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
    

    不要使用:

    tab.setPreferredScrollableViewportSize(new Dimension(1,1));
    

    这是一个不切实际的尺寸。该方法是为表格提供合理的首选大小,以便frame.pack() 方法可以工作。

    js.setPreferredSize(新维度(400,400));

    不要设置滚动窗格的首选大小。 setPreferredScrollableViewportSize() 用于指定表格的大小。

    mainPanel.setPreferredSize(new Dimension(500, 500));
    mainPanel.setSize(500,500);
    

    不要设置组件的大小或首选大小。每个组件负责确定自己的首选大小。

    mainPanel=new JPanel();

    默认情况下,JPanel 使用 FlowLayout,这意味着添加到它的任何组件都以其首选大小显示。我可能会将布局设置为 BorderLayout。然后组件可以根据可用空间调整大小,并根据需要使用滚动条。

    编辑:

    当首选的表格大小大于滚动窗格的大小时,会出现滚动条。所以你需要根据要在列中显示的文本的宽度来设置TableColumn的宽度。一个简单的方法是使用Table Column Adjuster 类,它将宽度设置为最大的文本行。在将模型(包含数据)添加到表中后,您将调用此类:

    更新代码:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import java.io.*;
    
    public class TableCreate extends JFrame
    {
        JPanel mainPanel;
        TableCreate() throws IOException
        {
    
            mainPanel=new JPanel(new BorderLayout());
            String InputFile1 = "TableCreate.java";
            BufferedReader breader1 = new BufferedReader(new FileReader(InputFile1));
            String line1 = "";
            line1 = breader1.readLine();
    
            DefaultTableModel model1 = new DefaultTableModel();
            model1.addColumn("line");
    
            while((line1=breader1.readLine()) != null)
             {
                 System.out.println(line1);
                 model1.addRow(new Object[]{line1});
             }
             breader1.close();
    
            JTable tab=new JTable(model1);
    
            tab.setPreferredScrollableViewportSize(new Dimension(300, 200));
            tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            TableColumnAdjuster tca = new TableColumnAdjuster(tab);
            tca.adjustColumns();
    
            JScrollPane js = new JScrollPane(tab);
            add(js);
        }
    
        public static void main(String[] args) throws IOException
        {
            TableCreate tc=new TableCreate();
            tc.pack();
            tc.setVisible(true);
            tc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    

    【讨论】:

    • 请阅读作者的整个问题,而不仅仅是主题;)
    • 我已经用过table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );并告诉结果。我没有使用框架,所以我不能使用 frame.pack() ,我只使用 JPanel。
    • @user2769274,是的,您使用的是 JFrame。为了显示面板,您必须将其添加到 JFrame(或 JDialog 或 JWindow)。在您的情况下,您正在扩展 JFrame,因此您确实将面板添加到框架中。而不是使用tc.setVisible(...),您应该使用tc.pack(),并且您需要进行我上面建议的所有更改。阅读 How to Use Table 上的 Swing 教程部分,了解如何正确创建带有表格的框架。
    • 我听从了你的所有建议,它使列的宽度变小了,水平滚动条的 ViewPort 仍然没有显示出来。
    • 如果我正在删除 tc.setVisible(true);,窗口不会出现。即使我正在放置 tc.pack();
    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2016-06-21
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2021-02-03
    • 2022-01-04
    相关资源
    最近更新 更多