使用JScrollPane的JApplet滚动条显示但不会在屏幕外滚动Graphics2D内容

时间:2015-03-29 01:08:04

标签: java swing jscrollpane graphics2d japplet

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

正如您所看到的,我尝试添加ScrollPane组件,并向其添加applet。然后我将滚动窗格添加到框架。

结果是我可以看到一个垂直滚动条,但它确实具有scrool的能力。实际上滚动光标丢失了。上下箭头也不会流淌。我想向下滚动到我绘制的那条走出可见区域的部分。

我做错了什么?

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();
    }
}

2 个答案:

答案 0 :(得分:3)

  

我将保留它,就像我正在关注的教程中一样。

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

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

f.getContentPane().add("Center", myScrollPane);

这不是将组件添加到Container的方式。你永远不会硬编码这样的约束。你也应该使用:

 add(component, constraint)

BorderLayout将包含可用于识别约束的字段。

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

查看Swing教程的目录。这些示例更新,并将为您的应用程序提供更好的设计。例如,您应该在Event Dispatch Thread上创建GUI组件,而您的代码并没有这样做。阅读Concurrency上的教程,了解其重要性。

答案 1 :(得分:2)

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

JScrollPane myScrollPane = new JScrollPane(applet);

或者

JScrollPane myScrollPane = new JScrollPane(applet,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

无论您如何实现它,滚动条只有在需要时才会启用和使用。它可能是可见的(如您的代码所示),但它没有必要启用滚动,因此它不允许您。

如果确定applet的大小大于myScrollPane的可用大小,则会激活所需的滚动条。这可以通过添加更多组件或根据需要覆盖setPreferredSize的{​​{1}},setSize方法来完成。


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

applet

enter image description here