java - 有没有其他方法可以在 JPanel 上绘图?

标签 java swing jframe jpanel drawing

所以,我在 JFrame 上绘制多个对象时遇到了麻烦,而且我知道我需要使用布局管理器,因此我决定在绘制多个对象之前先用一个对象对其进行测试,但是当我运行以下代码时:

        fps = 30;

        panel = new JPanel();

        frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(400,400);
        frame.addKeyListener(new key());

        running = true;
        update = true;

        ball = new Ball(0,0,1);

        //panel.setBackground(Color.BLACK);
        panel.add(ball);
        panel.setVisible(true);

        frame.add(panel, BorderLayout.CENTER);
        frame.requestFocus();
        frame.setVisible(true);

        startTime = System.currentTimeMillis();

没有任何内容(代码还有更多内容,我只是不想包含所有内容)。但是,当我删除注释并将背景设置为黑色时,JFrame 变为黑色。那么为什么它不会绘制我的 Ball 对象(我知道它可以工作)但会改变背景?在 JPanel 上绘图是否需要特定的方法?

最佳答案

panel = new JPanel();

默认情况下,JPanel 使用 FlowLayout,它尊重您添加到面板中的任何组件的大小。

ball = new Ball(0,0,1);

我不知道 Ball 类中的代码是什么样的,但我猜测首选大小是 (0, 0)。

您需要重写 Ball 类的 getPreferredSize() 方法以返回 Ball 的大小,以便布局管理器可以完成其工作。

阅读 Swing 教程中关于 Custom Painting 的部分了解更多信息和工作示例。

I know I need to use Layout managers,

在这种情况下,布局管理器的问题在于,布局管理器将控制球的位置,这可能是也可能不是您想要的。如果您希望球处于随机位置,则需要使用空布局。然后您需要使用 setSize() 和 setLocation() 方法来控制每个 Ball 组件。

另一种选择是对所有球进行自定义绘制。在这种情况下,您可以将要绘制的对象添加到 ArrayList。然后,自定义绘制代码将迭代列表中的对象并单独绘制它们。请参阅Playing With Shapes有关此方法的想法。

关于java - 有没有其他方法可以在 JPanel 上绘图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24311478/

相关文章:

java - 如何使 JFrame 按钮在 Netbeans 中打开另一个 JFrame 类?

java - Redshift JDBC41 驱动初始化异常

java - 如何将 Ellipse2D 和 Rectangle 作为一个形状表示/使用?

java - 如何改变窗口的颜色

java - 为什么我的 GUI 没有显示任何内容?

java - 在另一个类的框架中启用 Jbutton - GUIBuilder

java - 从类获取 boolean 值到主方法。 java

java - 如何使用 UiAutomator 为谷歌时钟设置闹钟?

以对象为键的 Java 8 流分组对象字段

java - 使用Prepared插入MySQL数据库