JTable 的滚动条

问题描述

所以我实际上有几个问题需要帮助。

1.) 实际上我可以将 sql Result 显示到 jList 中,到目前为止还可以。 我实际上缺少的是列的名称。它只是向我显示 MysqL 条目。

Database Result in jList

2.) 第二个问题是,我的数据库实际上包含更多信息。我也想在 jList 中显示它,但为了防止出现一个巨大的窗口,我想添加一个水平和垂直滚动条。

我尝试添加一个,但每当我这样做时,列表就会突然消失。将滚动条添加到列表实际上会是什么样子?

我的 Java 程序的下一步将是 MysqL 操作。我想更改接收到的数据集的值并将其发回。我想我会用某种 getSelectedRow 来做到这一点,对吗?

非常感谢您的帮助

public class aPanel extends JFrame{

    private JTable jt;
    

    
    public aPanel() {
        
        getContentPane().setLayout(null);
        
        setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0,780,450);
        JPanel contentPane = new JPanel();
        contentPane.setBackground(new Color (51,51,51));
        contentPane.setBorder(new EmptyBorder(5,5,5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JPanel leftTitle = new JPanel();
        leftTitle.setBackground(new Color (51,153,255));
        leftTitle.setBounds(0,230,450);
        contentPane.add(leftTitle);
        leftTitle.setLayout(null);

        String[] columnNames = {"ID","First_Name","Last_Name"};
        DefaultTableModel tableModel = new DefaultTableModel(columnNames,0);



        try {
            // Establishment of JDBC Connection
            String url = "jdbc:MysqL://localhost:3306/eHealthDB?serverTimezone=UTC";
            Connection con = DriverManager.getConnection(url,"root","root");
            
            String sql = "SELECT ID,First_Name,Last_Name FROM patient;";
            
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            
            while(rs.next() ) 
            {
                String pID = rs.getString("ID");    
                String vName = rs.getString("First_Name");
                String nName = rs.getString("Last_Name");   

                
                String[] data = {pID,vName,nName};
                tableModel.addRow(data);
                
            }
            

       
            jt = new JTable();
            jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            jt.setCellSelectionEnabled(false);
            jt.setRowSelectionAllowed(true);
            jt.setBorder(new LineBorder(Color.WHITE));
            jt.setForeground(Color.WHITE);
            jt.setBackground(new Color (59,59,59));
            jt.setBounds(370,52,251,167);
            contentPane.add(jt);
            jt.setModel(tableModel);
            
            
        }  catch (Exception e1) {
            System.out.println(e1);
        }
        
    }
}

解决方法

  1. 不要使用空布局(去掉那些代码)
  2. 不要使用 setBounds(...)(去掉那个代码)

Swing 旨在与布局管理器一起使用。布局管理器将根据布局管理器的规则为组件指定大小/位置。

我实际上缺少的是列的名称。

为了显示列名称,必须将表格添加到 JScrollPane 的视口中,并将滚动窗格添加到框架中。

所以基本的变化是:

//contentPane.setLayout(null);
contentPane.setLayout(new BorderLayout());

//contentPane.add(jt);
contentPane.add(new JScrollPane(jt),BorderLayout.CENTER);

这将允许表格填充框架中的可用空间。滚动条将根据需要出现。阅读关于 Layout Managers 的 Swing 教程中的部分,了解更多信息和工作示例。

,

你的问题是“JList”,但你的代码显示了一个 JTable——这有点令人困惑

话虽如此,您这里有一个大问题:

 jt.setBounds(370,52,251,167);

永远不要限制扩展组件(如 JTable 或 JTextArea)的大小,因为这会阻止它在 JScrollPane 中正常显示,因为它人为地限制了它的大小。如果你要限制任何东西的大小,它应该是 JScrollPane 的视口,并且只能非常小心地做到这一点。

接下来,您要将 JTable 本身添加到 GUI,并且应该将 JTable 添加到 JScrollPane,实际上是添加到 JScrollPane 的视口,然后将包含的 JScrollPane 添加到 GUI。

例如

jt = new JTable();
jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
jt.setCellSelectionEnabled(false);
jt.setRowSelectionAllowed(true);
jt.setBorder(new LineBorder(Color.WHITE));
jt.setForeground(Color.WHITE);
jt.setBackground(new Color (59,59,59));
// jt.setBounds(370,167);
JScrollPane scrollPane = new JScrollPane(jt);
// contentPane.add(jt);
jt.setModel(tableModel);
contentPane.add(scrollPane);