java - 列标题未显示在 JTable 中

标签 java swing layout-manager swingbuilder

尽管我已阅读所有相关答案,但我仍然停留在如何在 JTable 中显示列标题的问题上。我尝试添加 JScrollPane 但它不起作用。请提供任何帮助。下面给出代码:

        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);

}

最佳答案

这可能是你的罪魁祸首:

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

您人为地限制了 JTable 的大小,从而影响了它的放置和渲染。所以,是的,请将 JTable 放入 JScrollPane 中,不,不要设置任何组件的边界。您应该避免在 Java Swing 程序中使用 null 布局和 setBounds(...),因为这会导致 GUI 非常不灵活,虽然它们在一个平台上看起来不错,但看起来很糟糕在大多数其他平台或屏幕分辨率上,这非常难以更新和维护(正如您所发现的)。

您可以在此处找到 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);
         }
      });
   }

}

关于java - 列标题未显示在 JTable 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27090311/

相关文章:

java - Spring Boot在保存后为关系实体返回空值

java - 在 jframe 中移动形状

java - GUI 中的按钮、文本字段、标签布局

Java 按钮无法按预期工作

带有框架和面板的 Java 布局

java - BorderLayout - 两个组件中只有一个出现在 SOUTH 中

java - Jaxws 不填充结果

java - 对 Spring 非托管 bean 的依赖注入(inject)

java - 我应该使用哪个 Java 集合来实现线程安全缓存?

java - 如何布局? (JFrame、JPanel 等)