JScrollPane,添加到JPanel 还是JTable?
JScrollPane, add to JPanel or JTable?
我在 Google 上搜索了几个小时,但似乎没有任何效果。
我有一个 JTable,框架内有一个 JPanel。 table 有来自数据库的数据,但有大量数据要存储(因此需要 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);
在图像中,JScrollPane 在标有红色方块的区域可见。我在 table 中有更多不可见的数据,这就是为什么我想将 JScrollPane 添加到 table,但我的面板上的 table 下方也有按钮为什么我想把它添加到面板中。
我的代码可能不是很好,因为我遵循了几个关于如何克服问题并将它们混合在一起的教程。
感谢任何帮助!
编辑:
我注意到我在面板上添加了两次卷轴。我现在已经删除了它,但如果那是你认为的那样,仍然没有解决问题
另一张图片是我在面板中添加 GridLayout 时发生的情况
我认为你混淆了 JScrollPane
和 JScrollBar
:
JScrollPane
是一个包装器,您可以在其中添加大量内容,当此内容超过容器大小时,它将显示 JScrollBar
(垂直或水平,或两者)。
JScrollBar
是您单击并滚动的实际水平或垂直滚动条。
一般来说,您应该使用 JScrollPane
并让它为您处理滚动条。
根据以上,你的问题的答案是:
- 将
JTable
添加到 JScrollPane
(new JScrollPane(table);
)。根据您的情况,您只需要 一个 JScrollPane
。
- 将
JScrollPane
添加到 JPanel
(您也可以向其添加按钮)
- 将
JPanel
添加到 JFrame
另外:
- 你应该使用layout managers(默认情况下,一个
JPanel
有一个FlowLayout
,这可能不是很方便)。
- 您不需要分别添加您的 table 和您的 table 的 header。
- 您不需要使用
repaint()
或 revalidate()
首先,您无需创建两个 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
在您的原始代码中,您将(空的)ScrollPanel 和 table 添加到了 JPanel。
我在 Google 上搜索了几个小时,但似乎没有任何效果。
我有一个 JTable,框架内有一个 JPanel。 table 有来自数据库的数据,但有大量数据要存储(因此需要 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);
在图像中,JScrollPane 在标有红色方块的区域可见。我在 table 中有更多不可见的数据,这就是为什么我想将 JScrollPane 添加到 table,但我的面板上的 table 下方也有按钮为什么我想把它添加到面板中。
我的代码可能不是很好,因为我遵循了几个关于如何克服问题并将它们混合在一起的教程。
感谢任何帮助!
编辑:
我注意到我在面板上添加了两次卷轴。我现在已经删除了它,但如果那是你认为的那样,仍然没有解决问题
另一张图片是我在面板中添加 GridLayout 时发生的情况
我认为你混淆了 JScrollPane
和 JScrollBar
:
JScrollPane
是一个包装器,您可以在其中添加大量内容,当此内容超过容器大小时,它将显示JScrollBar
(垂直或水平,或两者)。JScrollBar
是您单击并滚动的实际水平或垂直滚动条。
一般来说,您应该使用 JScrollPane
并让它为您处理滚动条。
根据以上,你的问题的答案是:
- 将
JTable
添加到JScrollPane
(new JScrollPane(table);
)。根据您的情况,您只需要 一个JScrollPane
。 - 将
JScrollPane
添加到JPanel
(您也可以向其添加按钮) - 将
JPanel
添加到JFrame
另外:
- 你应该使用layout managers(默认情况下,一个
JPanel
有一个FlowLayout
,这可能不是很方便)。 - 您不需要分别添加您的 table 和您的 table 的 header。
- 您不需要使用
repaint()
或revalidate()
首先,您无需创建两个 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
在您的原始代码中,您将(空的)ScrollPanel 和 table 添加到了 JPanel。