2016-10-29 95 views
-1

我为我的JTable添加了JScrollPane。它出现了,但不可滚动。JScrollPane不属于JTable

public class AddDepartment extends JFrame { 
    private static JPanel contentPane; 
    private Connection DBConnection; 
    static Connection conn = new DBConnection().connect(); 
    static PreparedStatement pstmt = null; 
    static ResultSet rs = null; 
    static DefaultTableModel model = null; 
    private static JTable tableDepartments; 
    private static JScrollPane scrollPane; 

    public AddDepartment() throws SQLException { 
     model = new DefaultTableModel(); 
     tableDepartments = new JTable(model); 
     tableDepartments.setRowSelectionAllowed(false); 
     tableDepartments.setEnabled(false); 
     tableDepartments.setSize(new Dimension(197, 66)); 
     tableDepartments.setLocation(161, 34); 
     tableDepartments.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

     updateDepartments(); 
    } 

    private static void updateDepartments() throws SQLException { 
     try { 
      String sql = "SELECT Name FROM Departments"; 
      pstmt = conn.prepareStatement(sql); 
      rs = pstmt.executeQuery(); 

      model.addColumn("Name"); 
      while (rs.next()) { 
       String departmentName = rs.getString("Name"); 
       model.addRow(new Object[] { departmentName }); 
      } 
      if (tableDepartments.getRowCount() > 5) { 
       scrollPane = new JScrollPane(tableDepartments); 
       scrollPane.setSize(new Dimension(10, 50)); 
       scrollPane.setLocation(360, 34); 
       scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
       contentPane.add(scrollPane); 
      } 
      contentPane.add(tableDepartments); 
     } catch (Exception ex) { 
      JOptionPane.showMessageDialog(null, ex); 
     } finally { 
      rs.close(); 
      pstmt.close(); 
     } 
    } 
} 

部门表:

Departments table

This is how it looks like

上图为它的样子。我不能scrolldown。

+1

(1)这不是一个SSCCE。有多少次你必须被告知我们不能执行这段代码,因为我们没有访问你的数据库!你的问题是关于滚动,这与从数据库获取数据完全无关。您已被告知多次发布您的SSCCE硬编码数据,以便我们可以执行您的代码以查看到底发生了什么。如果你需要帮助而不是在同一主题上提问4个问题。通过适当的SSCCE,这将在第一个问题中得到解决。 – camickr

回答

2

通过限制你的JTable大小:

tableDepartments.setSize(new Dimension(197, 66)); 

你阻止它需要上浆,从而防止它滚动。不要这样做,而是让它扩展到所需的大小。如果这不能解决您的问题,那么您将需要创建并发布有效的sscce,这是一个没有数据库代码的程序,没有与问题无关的代码,并且可以向我们展示您的问题。

的其他问题包括过度使用static修饰符的毛,和你设置绝对大小和位置(可能使用空布局),不过那是另外一个问题


编辑
你'将您的JTable 两次添加到GUI中,一次添加到JScrollPane(好),再次添加到contentPane(坏),这会让您感到困惑,因为您只能将组件添加到一个容器中。第二个添加是从jscrollpane中移除jtable。解决方案:不要这样做。将jscrollpane添加到contentPane,而不是 JTable。

因此摆脱:

contentPane.add(tableDepartments); 
+0

但是,如果我删除你写的行,表消失。你能否解释你最后一段想说的话? – Munchmallow

+0

@Munchmallow:然后创建并发布[mcve] a [sscce](http://sscce.org)。请检查链接。回顾最后一条语句,如果使用空布局,并设置组件的大小,则可以创建几乎不可能调试或增强的刚性gui。过度使用静态代码会增加代码的连通性,从而增加错误的风险。 –

+0

@Munchmallow:狗屎,你添加JTable **两次**到GUI,一次到jscrollpane(好),然后再次到contentpane(坏)。不要这样做! –