水平滚动条无法在Java Swing中使用JTable

水平滚动条无法在Java Swing中使用JTable,java,swing,jtable,jscrollpane,Java,Swing,Jtable,Jscrollpane,我有一个JTable,我正在传入JScrollPane。垂直滚动条显示正常,但水平滚动条不工作。我提供的代码是可编译的,只需将路径放在InputFile1string中,并在该位置创建一个长文件 我尝试了很多解决方案,但都不管用。我有一个只有一列的表,该列包含文档中的行。我需要垂直和水平滚动条。请提出一些解决办法 其他尝试: 案例1: tab.setPreferredSize(new Dimension(400,400)); 如果我设置此选项,垂直滚动条将不起作用 案例2: tab.setAu

我有一个
JTable
,我正在传入
JScrollPane
。垂直滚动条显示正常,但水平滚动条不工作。我提供的代码是可编译的,只需将路径放在
InputFile1
string中,并在该位置创建一个长文件

我尝试了很多解决方案,但都不管用。我有一个只有一列的表,该列包含文档中的行。我需要垂直和水平滚动条。请提出一些解决办法

其他尝试:

案例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          
    }       
}
如果我设置这个,列宽会变得非常小。如果我试图使它变大,那么它也不工作,只显示一个水平滚动条,但没有视口

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

代码:

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          
    }       
}
您需要使用:

table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
不要使用:

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

js.setPreferredSize(新维度(400400))

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

mainPanel.setPreferredSize(new Dimension(500, 500));
mainPanel.setSize(500,500);
不要设置组件的大小或首选大小。每个组件负责确定其自身的首选尺寸

mainPanel=新的JPanel()

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

编辑:

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

更新代码:

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,所以我不能使用frame.pack(),我只使用JPanel。@user2769274,是的,您使用的是JFrame。要显示面板,必须将其添加到JFrame(或JDialog或JWindow)中。在您的例子中,您正在扩展JFrame,因此您确实要将面板添加到框架中。您应该使用
tc.pack()
而不是使用
tc.setVisible(…)
,并且您需要进行我上面建议的所有更改。阅读Swing教程中关于如何使用表格正确创建框架的工作示例部分。我遵循了您的所有建议,它使列的宽度变小,水平滚动条的视口仍然没有显示。如果我删除tc.setVisible(true);,窗口没有打开。即使我正在放置tc.pack();