水平滚动条不适用于 Java Swing 中的 JTable
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25569770/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Horizontal scrollbar is not working with JTable in Java Swing
提问by user2769274
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.
我有一个JTable
我正在传递JScrollPane
。垂直滚动条显示正常并且运行良好,但水平滚动条不起作用。我提供的代码是可编译的,只需将您的路径放在InputFile1
字符串中并在该位置创建一个长文件。
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:
案例1:
tab.setPreferredSize(new Dimension(400,400));
If I am setting this ,vertical scrollbar doesn't work.
如果我设置这个,垂直滚动条不起作用。
Case2:
案例2:
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
}
}
回答by camickr
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.
这是一个不切实际的大小。该方法是为表格提供合理的首选大小,以便该frame.pack()
方法起作用。
js.setPreferredSize(new Dimension(400,400));
js.setPreferredSize(新维度(400,400));
Don't set the preferred size of the scrollpane. The setPreferredScrollableViewportSize()
is used to specify a size for the table.
不要设置滚动窗格的首选大小。将setPreferredScrollableViewportSize()
用于指定大小的表。
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();
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.
默认情况下,JPanel 使用 FlowLayout,这意味着添加到它的任何组件都以其首选大小显示。我可能会将布局设置为 BorderLayout。然后组件可以根据可用空间调整大小,滚动条将根据需要使用。
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 Adjusterclass 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:
当表格的首选大小大于滚动窗格的大小时,会出现滚动条。所以需要TableColumn
根据要在列中显示的文本的宽度来设置 的宽度。一个简单的方法是使用Table Column Adjuster类,它将宽度设置为最大的文本行。在将模型(包含数据)添加到表后,您将调用此类:
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);
}
}