2014-08-29 43 views
1

我有一個JTable我正在通過JScrollPane。垂直滾動條顯示並工作良好,但水平滾動條不起作用。我提供的代碼是可編譯的,只需將您的路徑放入InputFile1字符串並在該位置創建一個長文件即可。水平滾動條不能在Java Swing中使用JTable

我已經嘗試了很多解決方案,但沒有任何工作。我有一個只有一列的表,該列包含文檔中的行。我需要垂直和水平滾動條。請提出一些解決方案。

其他嘗試:

案例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   
    }  
} 

回答

7

您需要使用:

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。然後,組件可以調整大小,並根據需要使用滾動條。

編輯:當表的優選尺寸比滾動窗格的尺寸更大

的滾動條出現。因此,您需要根據要顯示在列中的文本的寬度來設置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); 
    } 
} 
+0

請閱讀作者的全部問題,而不僅是主題;) – 2014-08-29 14:03:40

+0

我已經使用過table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);並告訴結果。我沒有使用frame,所以我不能使用frame.pack(),我只使用JPanel。 – user2769274 2014-08-29 14:14:34

+1

@ user2769274,是的,您正在使用JFrame。爲了顯示面板,您必須將其添加到JFrame(或JDialog或JWindow)。在你的情況下,你正在擴展JFrame,所以你添加面板到框架。您應該使用'tc.set()',而不是使用'tc.setVisible(...)',並且需要進行上面我建議的所有更改。閱讀[如何使用表格]上的Swing教程部分(http://docs.oracle.com/javase/tutorial/uiswing/components/table.html),瞭解如何正確創建帶有表格的框架。 – camickr 2014-08-29 14:20:16