【问题标题】:Scrollbar for JTableJTable 的滚动条
【发布时间】:2021-04-28 13:34:31
【问题描述】:

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

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

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, 0, 780, 450);
        JPanel contentPane = new JPanel();
        contentPane.setBackground(new Color (51,51,51));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JPanel leftTitle = new JPanel();
        leftTitle.setBackground(new Color (51,153,255));
        leftTitle.setBounds(0, 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);
        }
        
    }
}

【问题讨论】:

标签: java mysql database swing jtable


【解决方案1】:
  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 教程部分,了解更多信息和工作示例。

【讨论】:

    【解决方案2】:

    您的问题是“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, 52, 251,167);
    JScrollPane scrollPane = new JScrollPane(jt);
    // contentPane.add(jt);
    jt.setModel(tableModel);
    contentPane.add(scrollPane);
    

    【讨论】:

    • 感谢您的回答,我刚刚编辑了标题 - 现在应该是正确的。我根据您的反馈更改了我的代码,但我遇到了可见性问题。每当我添加一个 scrollPane 时,整个 jTable 都会消失。这可能是什么原因?
    • “每当我添加一个 scrollPane 时,整个 jTable 都会消失。这可能是什么原因?” 这是一个与上面回答的问题截然不同的问题。在 cmets 中不应提出新问题。请accept the answer 并在新问题线程中开始新问题。
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多