use*_*274 3 java swing jtable jscrollpane
我有一个JTable我传入的JScrollPane.垂直滚动条显示正常,但水平滚动条不起作用.我提供的代码是可编译的,只需将您的路径放在InputFile1字符串中并在该位置创建一个长文件.
我尝试了很多解决方案,但没有任何工作.我有一个只有一列的表,该列包含文档中的行.我需要垂直和水平滚动条.请提出一些解决方案.
其他尝试:
案例1:
tab.setPreferredSize(new Dimension(400,400));
Run Code Online (Sandbox Code Playgroud)
如果我设置此项,垂直滚动条不起作用.
案例2:
tab.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
Run Code Online (Sandbox Code Playgroud)
如果我设置它,列宽会变得非常小.如果我试图使它变大,那么它也不起作用,只显示水平滚动条但没有视口.
您可以取消注释并检查它们.
码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
cam*_*ckr 10
你需要使用:
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
Run Code Online (Sandbox Code Playgroud)
不要使用:
tab.setPreferredScrollableViewportSize(new Dimension(1,1));
Run Code Online (Sandbox Code Playgroud)
这是一个不切实际的规模.该方法是为表提供合理的首选大小,以便该frame.pack()方法可行.
js.setPreferredSize(new Dimension(400,400));
不要设置滚动窗格的首选大小.将setPreferredScrollableViewportSize()用于指定大小的表.
mainPanel.setPreferredSize(new Dimension(500, 500));
mainPanel.setSize(500,500);
Run Code Online (Sandbox Code Playgroud)
不要设置组件的大小或首选大小.每个组件负责确定自己的首选大小.
mainPanel = new JPanel();
默认情况下,JPanel使用FlowLayout,这意味着添加到其中的任何组件都以其首选大小显示.我可能会将布局设置为BorderLayout.然后组件可以使用可用空间调整大小,并根据需要使用滚动条.
编辑:
当表的首选大小大于滚动窗格的大小时,会出现滚动条.因此,您需要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);
}
}
Run Code Online (Sandbox Code Playgroud)