所以,我在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上绘制特定的方法?
答案 0 :(得分:0)
panel = new JPanel();
默认情况下,JPanel使用的FlowLayout
尊重您添加到面板的任何组件的大小。
ball = new Ball(0,0,1);
我不知道您的Ball类中的代码是什么样的,但我猜测首选大小是(0,0)。
您需要覆盖Ball类的getPreferredSize()
方法以返回Ball的大小,以便布局管理器可以完成其工作。
阅读Custom Painting上Swing教程中的部分,了解更多信息和工作示例。
我知道我需要使用布局管理器,
在这种情况下,布局管理器的问题是布局管理器将控制球的位置,这可能是您想要的,也可能不是。如果你想要随机位置的球,那么你需要使用空布局。然后,您需要使用setSize()和setLocation()方法来控制每个Ball组件。
另一种选择是对所有球进行自定义绘画。在这种情况下,您将添加要绘制到ArrayList的对象。然后,自定义绘制代码将遍历列表中的对象并单独绘制它们。有关此方法的建议,请参阅Playing With Shapes。