水平滚动条在Java Swing中不能与JTable一起使用

我有一个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 } } 

你需要使用:

 table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 

不要使用:

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

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

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

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

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

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

mainPanel = new JPanel();

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

编辑:

当表的首选大小大于滚动窗格的大小时,会出现滚动条。 因此,您需要根据要在列中显示的文本的宽度来设置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); } }