所以,我在 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/