JScrollPane,添加到JPanel还是JTable?

时间:2015-09-15 13:03:49

标签: java swing jtable jpanel jscrollpane

我在这个问题上用Google搜索了几个小时,但似乎没有任何效果。

我有一个JTable,框架内有JPanel。该表包含来自数据库的数据,但存储了大量数据(因此需要JScrollPane)

这是我的代码:

public GeneralDisplay()
{
    Insets insets = getInsets();

    panel = new JPanel();
    scrollVert = new JScrollPane(panel);
    scrollVert.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    scrollHor = new JScrollPane(panel);
    scrollHor.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

    newSoftwareBtn = new JButton("New");
    removeSofwtareBtn = new JButton("Remove");
    editSofwtareBtn = new JButton("Edit");

    ResultSet results;

    try
    {
        results = statement.executeQuery("SELECT * FROM Software");

        cSoftware = new JTable(buildTableModel(results));
    }
    catch(SQLException sqlEx)
    {
        JOptionPane.showMessageDialog(null, "Error: SQL error!");
        //System.exit(1);
    }

    ///////////////////////////////////////////////////
    //Adding to form
    ///////////////////////////////////////////////////

    getContentPane().add(panel);
    cSoftware.setBackground(null);
    cSoftware.getTableHeader().setBackground(null);
    //pack();

    panel.add(scrollVert);
    panel.add(scrollHor);
    panel.add(cSoftware.getTableHeader());
    panel.add(cSoftware);
    panel.add(newSoftwareBtn);
    panel.add(removeSofwtareBtn);
    panel.add(editSofwtareBtn);
    panel.add(scrollVert);
    panel.add(scrollHor);

    panel.revalidate();
    panel.repaint();

    //////////////////////////////////////////////////////

    //////////////////////////////////////////////////////
    //Position on form
    //////////////////////////////////////////////////////

    Dimension size = newSoftwareBtn.getPreferredSize();
    newSoftwareBtn.setBounds(5 + insets.left, 480 + insets.top, size.width, size.height);

    size = removeSofwtareBtn.getPreferredSize();
    removeSofwtareBtn.setBounds(55 + insets.left, 480 + insets.top, size.width, size.height);

    size = editSofwtareBtn.getPreferredSize();
    editSofwtareBtn.setBounds(105 + insets.left, 480 + insets.top, size.width, size.height);

enter image description here

在图像中,JScrollPane在标有红色方块的区域中可见。我在表中有更多数据是不可见的,这就是为什么我想把JScrollPane添加到表中,但是我的面板下面也有按钮,这就是我想把它添加到面板的原因。

我的代码可能不太好,因为我已经学过如何克服这个问题的几个教程,并将它们混合在一起。

任何帮助表示赞赏!

编辑:

我注意到我将我的卷轴添加到面板两次。我现在删除了它,但如果你认为它是

,仍然无法解决问题

另一张图片是我在面板中添加GridLayout时发生的事情

enter image description here

2 个答案:

答案 0 :(得分:2)

首先,您不需要创建两个JScrollPanes以同时拥有垂直和水平滚动条。

就ScrollPane与其他组件分离而言,您需要将JTable添加到ScrollPane,然后将其添加到JPanel。像这样:

JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

scrollPane.add(cSoftware);
panel.add(scrollPane);
//add buttons etc

在原始代码中,您将(空)ScrollPanels和表格都添加到JPanel。

答案 1 :(得分:1)

我认为您将JScrollPaneJScrollBar混淆:

  • JScrollPane是一个包装器,您可以在其中添加大内容,当此内容超出容器大小时,将显示JScrollBar(垂直或水平或两者)。
  • JScrollBar是您单击并滚动的实际水平或垂直滚动​​条。

一般情况下,您应该使用JScrollPane并让它为您处理滚动条。

基于以上所述,您的问题的答案是:

  • JTable添加到JScrollPanenew JScrollPane(table);)。在您的情况下,您只需要一个 JScrollPane
  • JScrollPane添加到JPanel(您还可以添加按钮)
  • JPanel添加到JFrame

此外:

  • 您应该使用layout managers(默认情况下,JPanel有一个FlowLayout,这可能不太方便。)
  • 您无需单独添加表格和表格标题。
  • 您无需使用repaint()revalidate()