我有一个 JScrollPane,其中有一个 JPanel,除了一个缺陷之外,它工作得很好。当我运行该程序时,JScrollPane 被添加并显示在其父面板上,但它内部的内容没有显示。
如果我调整窗口大小或者在 JPanel 上滚动,内容会立即显示。我还检查过 JPanel 和 JScrollPane 的尺寸都是正确的。 Repaint 也被调用,所以我不认为我错过了任何东西。
我也看过这个问题,但没有帮助: JScrollPane doesn't show scroll bars when JPanel is added
故意使用空布局,我正在执行自己的格式,而不是考虑多种尺寸的屏幕。提前谢谢您!
class FilesPanel extends JPanel
{
public JScrollPane scroller;
private FileHolderPanel holder;
public FilesPanel()
{
//setLayout(null);
setBackground(extraLight);
holder = new FileHolderPanel();
System.out.println(holder.getWidth() + " " + holder.getHeight() + " " + holder.getX() + " " + holder.getY() + " " + holder.getBounds());
scroller = new JScrollPane();
JViewport viewport = new JViewport();
viewport.add(holder);
scroller.setViewport(viewport);
scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scroller.setBorder(BorderFactory.createEmptyBorder());
scroller.setBackground(blue);
add(scroller);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
scroller.setLocation(0, 0);
scroller.setSize(filesWidth, frame.getHeight() - 40);
}
class FileHolderPanel extends JPanel
{
public FileHolderPanel()
{
setBackground(extraLight);
setLayout(null);
setVisible(true);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
}
}
}
最佳答案
“主要”问题是 FileHolderPanel
不知道它可能想要的大小,因此 JScrollPane
不知道它需要多大是或何时应该显示其滚动条。这是一些猜测工作,因为您没有提供完全可运行的示例。
类似下面的示例效果很好......
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new ContentPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ContentPane extends JPanel {
public ContentPane() {
setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(new FileHolderPane());
scrollPane.setBorder(BorderFactory.createEmptyBorder());
scrollPane.setBackground(Color.BLUE);
add(scrollPane);
}
}
public class FileHolderPane extends JPanel {
public FileHolderPane() {
setBackground(Color.RED);
setLayout(new GridBagLayout());
add(new JLabel("All your content is belong to us"));
}
@Override
public Dimension getPreferredSize() {
// This will make the panel a fixed size, so beware of that
return new Dimension(400, 400);
}
}
}
如果您需要更多控制,那么您可能需要查看可滚动
界面
,但这是另一个复杂程度
关于java - JScrollPane 在鼠标滚动或调整框架大小之前不显示内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60824760/