Java 使用JScrollPane的JApplet滚动条显示但不显示';t在屏幕外滚动图形2D内容

Java 使用JScrollPane的JApplet滚动条显示但不显示';t在屏幕外滚动图形2D内容,java,swing,jscrollpane,graphics2d,japplet,Java,Swing,Jscrollpane,Graphics2d,Japplet,我正在尝试向JApplet组件添加滚动条。我知道我不应该使用它,而应该使用JPanel,但为了简单起见,我会像下面的教程一样保留它 正如您所看到的,我尝试添加一个滚动窗格组件,并将小程序添加到其中。然后我将滚动窗格添加到框架中 结果是,我可以看到一个垂直滚动条,但它确实有能力crool。实际上,缺少滚动光标。上下箭头也不会发出声音。我想向下滚动到我画的线中超出可见区域的部分 我做错了什么 public class App { private App() { final

我正在尝试向JApplet组件添加滚动条。我知道我不应该使用它,而应该使用JPanel,但为了简单起见,我会像下面的教程一样保留它

正如您所看到的,我尝试添加一个滚动窗格组件,并将小程序添加到其中。然后我将滚动窗格添加到框架中

结果是,我可以看到一个垂直滚动条,但它确实有能力crool。实际上,缺少滚动光标。上下箭头也不会发出声音。我想向下滚动到我画的线中超出可见区域的部分

我做错了什么

public class App {

    private App() {
        final int WINHSIZE = 800;
        final int WINVSIZE = 600;

        class MyJApplet extends JApplet {

            public void init() {
                setBackground(Color.black);
                setForeground(Color.white);
            }

            public void paint(Graphics g) {
                Graphics2D g2 = (Graphics2D) g;
                        g2.drawLine(0, 0, 2000, 2000);
                }
            }
        }


        JFrame f = new JFrame("Title");
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        JApplet applet = new MyJApplet();
        JScrollPane myScrollPane = new JScrollPane(applet, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        f.getContentPane().add("Center", myScrollPane);
        applet.init();
        f.pack();
        f.setSize(new Dimension(WINHSIZE, WINVSIZE));
        f.setVisible(true);

    }


    public static void main(String[] args) {
        new App();
    }
}

您已将它们设置为始终可见。这意味着即使不需要滚动,它们仍然会出现。如果您不想显示垂直滚动条,只需执行以下操作:

JScrollPane myScrollPane = new JScrollPane(applet);


无论您如何实现它,滚动条都将仅在需要时启用和可用。它可能是可见的(正如您的代码所示),但它没有启用滚动的意义,因此它不允许您这样做

如果确定
applet
的大小大于
myScrollPane
的可用大小,则所需的滚动条将被激活。这可以通过添加更多组件或根据需要覆盖
小程序的
setPreferredSize
setSize
方法来实现


例如,此代码示例显示滚动条(在本例中为水平)如何仅在需要时激活。剩下的时间,它将是可见的,但不是活动的,这就是你所看到的

final JFrame frame = new JFrame("Scroll Bar Test");
final JPanel content = new JPanel(new FlowLayout(FlowLayout.LEADING));
final JScrollPane scrollPane = new JScrollPane(content, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

for(int i = 0; i < 10; i++){
    content.add(new JLabel("Label " + i));
}

frame.add(scrollPane);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
final JFrame=新JFrame(“滚动条测试”);
最终JPanel内容=新JPanel(新FlowLayout(FlowLayout.LEADING));
final JScrollPane scrollPane=新JScrollPane(内容,JScrollPane.VERTICAL\u SCROLLBAR\u根据需要,ScrollPaneConstants.HORIZONTAL\u SCROLLBAR\u始终);
对于(int i=0;i<10;i++){
添加(新的JLabel(“标签”+i));
}
frame.add(滚动窗格);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);

您已将它们设置为始终可见。这意味着即使不需要滚动,它们仍然会出现。如果您不想显示垂直滚动条,只需执行以下操作:

JScrollPane myScrollPane = new JScrollPane(applet);


无论您如何实现它,滚动条都将仅在需要时启用和可用。它可能是可见的(正如您的代码所示),但它没有启用滚动的意义,因此它不允许您这样做

如果确定
applet
的大小大于
myScrollPane
的可用大小,则所需的滚动条将被激活。这可以通过添加更多组件或根据需要覆盖
小程序的
setPreferredSize
setSize
方法来实现


例如,此代码示例显示滚动条(在本例中为水平)如何仅在需要时激活。剩下的时间,它将是可见的,但不是活动的,这就是你所看到的

final JFrame frame = new JFrame("Scroll Bar Test");
final JPanel content = new JPanel(new FlowLayout(FlowLayout.LEADING));
final JScrollPane scrollPane = new JScrollPane(content, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

for(int i = 0; i < 10; i++){
    content.add(new JLabel("Label " + i));
}

frame.add(scrollPane);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
final JFrame=新JFrame(“滚动条测试”);
最终JPanel内容=新JPanel(新FlowLayout(FlowLayout.LEADING));
final JScrollPane scrollPane=新JScrollPane(内容,JScrollPane.VERTICAL\u SCROLLBAR\u根据需要,ScrollPaneConstants.HORIZONTAL\u SCROLLBAR\u始终);
对于(int i=0;i<10;i++){
添加(新的JLabel(“标签”+i));
}
frame.add(滚动窗格);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);

我会像在下面的教程中一样保留它

嗯,你的教程很旧,你不应该遵循它。相反,您应该学习如何以正常方式创建JFrame

也就是说,您可以通过覆盖
paintComponent()
方法在JPanel上进行自定义绘制,然后将面板添加到框架中。不应覆盖paint()。有关更多信息,请阅读Swing教程(这是一个更好的后续教程)中的部分。您需要确保覆盖
getPreferredSize()
方法,以便滚动条可以正常工作

f.getContentPane().add("Center", myScrollPane);
这不是向容器添加组件的方式。您永远不会硬编码这样的约束。此外,您还应使用:

 add(component, constraint)
BorderLayout将包含可用于标识约束的字段

人们不再使用
f.getContentPane().add(…)
。由于JDK4,您可以使用
f.add(…)
。正如我所说,你的教程已经过时了

查看Swing教程的目录。这些示例是最新的,将为您的应用程序提供更好的设计。例如,您应该在事件分派线程上创建GUI组件,而您的代码没有这样做。阅读
并发性
教程,了解这一点的重要性

我会像在下面的教程中一样保留它

嗯,你的教程很旧,你不应该遵循它。相反,您应该学习如何以正常方式创建JFrame

也就是说,您可以通过覆盖
paintComponent()
方法在JPanel上进行自定义绘制,然后将面板添加到框架中。不应覆盖paint()。有关更多信息,请阅读Swing教程(这是一个更好的后续教程)中的部分。您需要确保覆盖
getPreferredSize()
方法,以便滚动条可以正常工作

f.getContentPane().add("Center", myScrollPane);
这不是向容器添加组件的方式。您永远不会硬编码这样的约束。此外,您还应使用:

 add(component, constraint)
BorderLayout将包含可用于标识约束的字段

人们不再使用
f.getContentPane().add(…)
。由于JDK4,您可以使用