水平滚动条在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); } }