【问题标题】:JApplet scrollbar using JScrollPane shows but doesn't scroll Graphics2D content outside screen使用 JScrollPane 的 JApplet 滚动条显示但不在屏幕外滚动 Graphics2D 内容
【发布时间】:2015-03-29 01:08:03
【问题描述】:

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

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

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

我做错了什么?

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

【问题讨论】:

    标签: java swing jscrollpane graphics2d japplet


    【解决方案1】:

    我会保持不变,就像我正在关注的教程中一样。

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

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

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

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

     add(component, constraint)
    

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

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

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

    【讨论】:

    • 谢谢。我相信他们应该在tutorialspoint.com/javaexamples/gui_line.htm 下线这个例子。我敢肯定,很多错误的代码和问题都源自那里!另外我认为使用f.getContentPane().add(...) 代替最近的f.add(...) 并不能解决这个问题,但是是的,我也会指出这一点:) 而且我知道 EDT 的重要性并避免阻塞主线程.前段时间,我正确地使用 EDT 和一个用于并发连接的线程池开发了一个小应用程序,并阅读了所有相关信息。但现在一切都消失了:)
    • 更改为 Jpanel,一切正常。再次感谢您让我重回正确的道路。任何其他人在这里结束,不要忘记在paintComponent ovverride中的任何其他内容之前也调用super.paintComponent(g);
    【解决方案2】:

    您已将它们设置为始终可见。这意味着即使不需要滚动 - 它们仍然会出现。如果您不想出现垂直滚动条,您可以这样做:

    JScrollPane myScrollPane = new JScrollPane(applet);
    

    或者

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

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

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


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

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

    【讨论】:

    • 感谢漂亮的 gif :) 现在我已经解决了滚动条光标根本不显示的问题(即使它需要的)我正在尝试了解这是否也适用于 Graphics2d 组件,即在鼠标单击时,我将绘制一条距离 JPanel 200 像素的线。滚动条会相应地调整大小吗?
    • @jj_ 不幸的是,它不会。但是,您可以在需要时更改大小。但是,您可以计算“工作区域”,然后通过setSizesetPreferredSize 更改面板以适应该区域。
    • 我也有类似的问题。找遍了全网,找不到有趣的东西。内容面板有固定大小怎么样,这样“标签 3”会下降,“标签 6”会下降到下一个位置,依此类推。我的滚动窗格没有显示它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多