2014-11-23 7 views
0

Хотя я прочитал все соответствующие ответы, я все еще зациклился на вопросе о том, как отображать заголовки столбцов в JTable. Я попытался добавить JScrollPane, но это не сработало. Любая помощь пожалуйста. Ниже приведен код:Заголовки столбцов не отображаются в JTable

 frame = new JFrame(); 

     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new CardLayout(0, 0)); 

     final JPanel panel = new JPanel(); 
     final JPanel panel_1 = new JPanel(); 
     final JTable table = new JTable(); 
     frame.getContentPane().add(panel, "name_762477085406274"); 
     panel.setLayout(null); 

     JButton btnOk = new JButton("ok"); 
     btnOk.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent arg0) 
      { 
       panel.setVisible(false); 
       panel_1.setVisible(true); 


       final Connection connect; 
       final Statement statement; 
       final ResultSet resultset; 

       try 
       { 
         Class.forName("com...."); 

         connect = DriverManager.getConnection("jdbc:mysql..."); 

         System.out.println("Connecting succesfully"); 
         statement = connect.createStatement(); 
         resultset = statement.executeQuery("select ProjName as 'Project Name', ProjID as 'Project ID' from projdetails"); 
         //table.setModel(DBUtils.resultSetToTableModel(resultset)); 

         ResultSetMetaData rsmetadata = resultset.getMetaData(); 
         System.out.println(rsmetadata); 
         int columns = rsmetadata.getColumnCount(); 
         System.out.println(columns); 
         DefaultTableModel dtm = new DefaultTableModel(); 
         Vector columns_name = new Vector(); 
         Vector data_rows = new Vector(); 
         for (int i =1; i<=columns;i++) 
         { 
        columns_name.addElement(rsmetadata.getColumnName(i)); 
        System.out.println(columns_name); 
         } 
         dtm.setColumnIdentifiers(columns_name); 

      //System.out.println(resultset); 
      /*while(resultset.next()) 
      { 
        Array lastname = resultset.getArray("ProjName"); 
        //lastname = 
        System.out.println(lastname); 
      }*/ 
      while (resultset.next()) 
      { 

       data_rows = new Vector(); 
       for(int j =1; j<=columns; j++) 
       { 
        data_rows.addElement(resultset.getString(j)); 
       } 

       dtm.addRow(data_rows); 
      } 
      table.setModel(dtm); 

       /* final String lastName = resultset.getString("ProjName"); 
       //final String lastName1 = resultset.getString("ProjID"); 
       System.out.println(lastName); 
       //System.out.println(lastName1); 
       lbl_ShowAllProjects.setText(lastName);//+" "+lastName1); 
       System.out.println("\n\n\t\t");*/ 



       } 

      catch(Exception e){ 

       System.out.println("Cannot connect to database server"); 

       e.printStackTrace(); 
      }} 

      }); 
    btnOk.setBounds(94, 117, 89, 23); 
    panel.add(btnOk); 


    frame.getContentPane().add(panel_1, "name_762480663629692"); 
    panel_1.setLayout(null); 


    table.setModel(new DefaultTableModel(
     new Object[][] { 
     }, 
     new String[] { 
      "Project Name", "Project ID" 
     } 
    ) { 
     boolean[] columnEditables = new boolean[] { 
      false, false 
     }; 
     public boolean isCellEditable(int row, int column) { 
      return columnEditables[column]; 
     } 
    }); 
    table.getColumnModel().getColumn(0).setResizable(false); 
    table.getColumnModel().getColumn(1).setResizable(false); 
    table.setBounds(25, 11, 399, 216); 
    panel_1.add(table); 
    //final JScrollPane scrollPane = new JScrollPane(table); 
    //JScrollPane scrollPane = new JScrollPane(table); 
    //panel_1.add(scrollPane); 
    //table.setFillsViewportHeight(true); 
    //frame.getContentPane().add(new JScrollPane(table)); 
// JScrollPane.setViewPortView(table); 

} 
+3

1) Да, положи JTable в JScrollPane. 2) Избавьтесь от ** all ** 'setBounds (...)' и нужных макетов в вашей программе, так как они затруднят Java для правильной настройки JTable и JScrollPane. Вместо этого используйте менеджеров компоновки, так как это то, за что они предназначены. 3) Давайте посмотрим вашу лучшую попытку сделать это с помощью JScrollPanes как [Минимальная, полная и проверенная программа примеров] (http://stackoverflow.com/help/mcve). В вашем комментированном коде содержится некорректируемый код. –

+1

Вам нужно использовать JScrollPane. Не использовать его не поможет. Отправьте полный пример, воспроизводящий проблему. Удалите из него все ненужные вещи JDBC. –

ответ

2

Это, скорее всего, ваш виновник:

table.setBounds(25, 11, 399, 216); 

Вы искусственно ограничивая размер JTable баловаться с его размещением и рендеринга. Итак, да, положите JTable в JScrollPane, и нет, не устанавливайте границы любого компонента. Вам следует избегать использования макета null и setBounds(...) с программами Java Swing, так как это делает для очень негибкого графического интерфейса, что, хотя они могут хорошо выглядеть на одной платформе, выглядят ужасно на большинстве других платформ или разрешениях экрана, которые очень сложно обновить и поддерживать (поскольку вы «выяснение).

Вы можете найти ссылки на Swing, учебные пособия, в том числе макет менеджера учебных пособий и других Свинг ресурсов здесь: Swing Info

Кроме того, при замене компонентов в контейнер, вы хотите звонить revalidate() и repaint(). Еще лучше использовать CardLayout, чтобы вы могли менять компоненты.


например,

import java.awt.*; 
import java.awt.event.*; 
import java.util.Vector; 

import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class Foo { 
    private static final String PANEL_KEY = "panel"; 
    private static final String PANEL_1_KEY = "panel 1"; 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new CardLayout(0, 0)); 

     final JPanel panel = new JPanel(); 
     final JPanel panel_1 = new JPanel(); 
     final JTable table = new JTable(); 
     frame.getContentPane().add(panel, PANEL_KEY); 
     frame.getContentPane().add(panel_1, PANEL_1_KEY); 
     JButton btnOk = new JButton("ok"); 
     panel.add(btnOk); 

     panel_1.setLayout(new BorderLayout()); 

     final JScrollPane scrollPane = new JScrollPane(table); 
     panel_1.add(scrollPane); 
     table.setFillsViewportHeight(true); 
     frame.pack(); 
     frame.setVisible(true); 

     btnOk.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      JPanel contentPane = (JPanel) frame.getContentPane(); 
      CardLayout cardLayout = (CardLayout) contentPane.getLayout(); 
      cardLayout.show(contentPane, PANEL_1_KEY); 

      String[] colNames = { "Mon", "Tues", "Wed" }; 
      DefaultTableModel dtm = new DefaultTableModel(); 
      Vector<String> columns_name = new Vector<>(); 
      for (String colName : colNames) { 
       columns_name.add(colName); 
      } 
      dtm.setColumnIdentifiers(columns_name); 
      table.setModel(dtm); 
     } 
     }); 
    } 

}