是否有不同的方式来绘制JPanel?

时间:2014-06-19 16:16:59

标签: 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上绘制特定的方法?

1 个答案:

答案 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