Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Horizontal scrollbar is not working with JTable in Java Swing

I have a JTable which I am passing in JScrollPane. The vertical scrollbar is showing up and working good, but the horizontal scrollbar is not working. The code I provided is compilable, just put your path in InputFile1 string and create a long file on that location.

I have tried many solutions but nothing is working. I have a table with only one column, that column contains lines from a document. I need both vertical and horizontal scrollbars. Please suggest some solution.

Other attempts:

Case1:

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

If I am setting this ,vertical scrollbar doesn't work.

Case2:

tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

If I set this, the column width becomes very small. If I try to make it larger then also it does not work and only shows a horizontal scroll bar but without a viewport.

You can uncomment and check them.

Code:

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          
    }       
}
like image 423
Ek1234 Avatar asked Dec 19 '22 11:12

Ek1234


1 Answers

You need to use:

table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

Don't use:

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

That is an unrealistic size. That method is to give a reasonable preferred size to the table so that the frame.pack() method will work.

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

Don't set the preferred size of the scrollpane. The setPreferredScrollableViewportSize() is used to specify a size for the table.

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

Don't set a size or a preferred size of a component. Each component is responsible for determining its own preferred size.

mainPanel=new JPanel();

By default a JPanel uses a FlowLayout which means any component added to it is displayed at its preferred size. I would probably set the layout to a BorderLayout. Then the component can resize with the space available and the scrollbars will be used as required.

Edit:

The scrollbars appear when the preferred size of table is greater than the size of the scrollpane. So you need to set the width of the TableColumn based on the width of the text to be displayed in the column. An easy way to do this is to use the Table Column Adjuster class which will set the width to the largest line of text. YOu would invoke this class after you have added the model (containing the data) to the table:

Updated code:

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);
    }
}
like image 191
camickr Avatar answered Jan 05 '23 00:01

camickr