2015-07-10 178 views
1

我制作了一个GUI JTable,它显示一个数据库。我有一个上浆问题。Java Swing制作JTable列填充JScrollPane

我该如何做到这一点,以便JTable的列将填充JScrollPane,但是如果在一个表中有很多列,例如它会保持默认大小并让它们滚动。

基本上..

如果SQL表中的一个不补JTable中,不需要再滚动我要做出更大的是JTable中的列,以便他们做配合。

如果SQL JTable确实需要滚动,那么我只想让它保持原样,因此需要滚动。

这是我的代码有使JTable中:

 JPanel panel1 = new JPanel(); 
     JTable table = new JTable(){ 
     private static final long serialVersionUID = 1L; 

      @Override 
       public boolean isCellEditable(int row, int column) { 
        return false; 
       } 

     }; 
     JScrollPane stable = new JScrollPane (table); 
     stable.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     stable.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     panel1.add(stable); 
+0

任何人都可以帮忙吗? –

+0

你有一个非常昂贵的问题。为了知道列的宽度要求,你必须检查EVERY行,然后你需要决定总的列宽是否大于或小于可视区域并根据你的状态改变'autoResizeMode'的开关状态想要做出。窗口大小调整后会发生什么?你是否要重新计算值? – MadProgrammer

+0

也许类似[this](http://stackoverflow.com/questions/15014950/jtable-horizo​​ntal-scrollbar-based-on-width-of-one-column/15015445#15015445) – MadProgrammer

回答

2

为了让你问什么呼叫以下之后方法表用新型号更新:

public static void tweakColumns(JTable table){ 
    Enumeration<TableColumn> columns = table.getColumnModel().getColumns(); 

    int required = 0; 
    while(columns.hasMoreElements()){ 
     TableColumn column = columns.nextElement(); 
     int width = (int)table.getTableHeader().getDefaultRenderer() 
        .getTableCellRendererComponent(table, column.getIdentifier() 
          , false, false, -1, column.getModelIndex()).getPreferredSize().getWidth(); 
     required += width; 
    } 

    JViewport viewport = (JViewport)SwingUtilities.getAncestorOfClass(JViewport.class, table); 
    int viewportWidth = viewport.getWidth(); 
    table.setAutoResizeMode(required<viewportWidth ? JTable.AUTO_RESIZE_ALL_COLUMNS : JTable.AUTO_RESIZE_OFF); 
} 
+0

你可能必须检查每一行,以确定你有任何给定列的最大所需宽度,这是一个非常昂贵的命题 – MadProgrammer

+0

你也应该更新你以前的回答 – MadProgrammer

+0

以上方法不会遍历所有行,它将使用表头的渲染器从列名计算宽度。所以这不是太昂贵 –

2

评论跟随你的代码行:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

这使得表中的列拉伸以填充滚动窗格的宽度

拉伸适合整个桌子宽度的列使其看起来很难看。相反,我建议将以下功能添加到您的表中。

http://www.jroller.com/santhosh/entry/jtable_becomes_uglier_with_autohttp://www.jroller.com/santhosh/entry/packing_jtable_columns

这使得您的JTable看起来更专业

+0

但是它也使得表格的加载非常小... –

+0

我理解你的问题。 –

+0

那么你会不会帮助...? –

0
import java.awt.Dimension; 
import java.awt.Font; 
import javax.swing.table.*; 
import java.sql.Connection; 
import java.sql.Statement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
public class StatusPage extends JPanel 
{ 
    static DefaultTableModel dm; 
    JTable table; 
    JScrollPane jsp_table; 
    static Connection conn; 
    static Statement stmt; 
    static ResultSet rs; 

    public StatusPage(Connection c) 
    { 
     conn = c; 
     String col_name[] = {"S.No.","Book Name","Author Name","ISBN","Available Book","Issue Book","Total Book"}; 
     dm = new DefaultTableModel(null,col_name); 
     table = new JTable(dm); 
     table.getTableHeader().setFont(new Font("Goudy Old Style" , Font.BOLD, 15)); 
       table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
       table.getColumnModel().getColumn(0).setPreferredWidth(50); 
       table.getColumnModel().getColumn(1).setPreferredWidth(175); 
       table.getColumnModel().getColumn(2).setPreferredWidth(175); 
       table.getColumnModel().getColumn(3).setPreferredWidth(125); 
       table.getColumnModel().getColumn(4).setPreferredWidth(111); 
       table.getColumnModel().getColumn(5).setPreferredWidth(90); 
       table.getColumnModel().getColumn(6).setPreferredWidth(90); 
     jsp_table = new JScrollPane(table); 
     jsp_table.setPreferredSize(new Dimension(850, 520)); 
     addRowTable(); 
     add(jsp_table); 
    } 
    public static void addRowTable() 
    { 
     try 
     { 
        int a = dm.getRowCount(); 
      int i=0; 
      while(i<a) 
      { 
       dm.removeRow(0); 
       i++; 
      } 

      stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
      rs = stmt.executeQuery("SELECT * FROM BOOK_TABLE"); 

      int count = 1; 
      while(rs.next()) 
      { 
       String s[] = new String[7]; 

       s[0] = ""+count; 
       s[1] = rs.getString(6); 
       s[2] = rs.getString(1); 
       s[3] = rs.getString(2); 
       s[4] = ""+rs.getInt(4); 
       s[5] = ""+rs.getInt(5); 
       s[6] = ""+rs.getInt(3); 

       count++; 

       dm.addRow(s); 
      } 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

阅读此代码,并改变你的代码,因为此代码的工作

+0

它不会总是来自同一张表 –