首页 > 解决方案 > 在 JPanel 中滚动 JFrame

问题描述

我用这个例子来绘制多边形作为基础来制作我自己的多边形抽屉,但保留了最重要的部分:

public class Main extends JPanel {

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    // polygon maker
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setTitle("DrawPoly");
    frame.setSize(1000, 1000);
    frame.setLocationRelativeTo(null);
    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
    Container contentPane = frame.getContentPane();
    contentPane.add(new Main());
    frame.show();
}
}

我发现如果多边形具有负坐标值,它们就会离开屏幕,而我无法看到它们的整体。为此,我想象某种滚动或缩放到在主内部创建的 JFrame,或者可能到内容窗格。如何使用链接代码作为基础实现简单的滚动?

标签: javaswingjframejpanel

解决方案


我发现如果多边形的坐标值为负,它们就会离开屏幕

您不能使用具有负值的 JScrollPane。

相反,您需要:

  1. 创建所有要绘制的多边形并将它们添加到 ArrayList。
  2. 遍历 ArrayList 以找到所有多边形的最大负 x/y 值
  3. 如果您发现负的“x”或“y”坐标,则再次遍历 ArrayList 并translate(...)通过 x 或 y 坐标的绝对值调用该方法,以将面板上的所有多边形移动到它们都将可见
  4. 最后,您遍历 ArrayList 并绘制每个多边形。

笔记。理想情况下,您将创建多边形并添加,然后在 paintComponent() 方法之外执行 ArrayList。然后进行翻译。所以现在 paintComponent() 方法只需要迭代 ArrayList 并绘制它们,而无需在每次组件需要重新绘制自身时进行创建/翻译。


推荐阅读