java swing不会显示

时间:2013-06-24 17:52:31

标签: java swing animation graphics awt

我目前正在尝试将动画添加到一个程序中,该程序包含各种对象在2D空间中移动和交互。我终于到了计时器工作的地方,程序让对象按照我想要的方式移动和交互......但它打开的显示面板仍然令人沮丧地空白。我一直在尝试使用在线发现的示例中的代码,但我仍然缺少一些东西......

    public class Populus2 extends JPanel 
{
    /**
     * @param args
     */

        static float[] xCoordinates;
        static float[] yCoordinates;
        static int duration;
        static int iteration = 1;
        static int graphSize = 500;
        ..............

        static JFrame frame;
        static JLabel lbl;  
        JPanel panel;
        static Timer timer;

        public static void main(String[] args) throws IOException {
            final Populus2 pop = new Populus2();

            frame = new JFrame("Animation Frame");
            lbl = new JLabel();
            Panel panel = new Panel();
            panel.add(lbl);
            frame.add(panel, BorderLayout.CENTER);
            frame.setSize(graphSize, graphSize);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            ActionListener timeStep = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    System.out.println("at time " + iteration);
                    spendTime();
                    pop.repaint();
                    if(iteration>duration)
                        timer.stop();
                }
            };

        timer = new Timer(100, timeStep);
        timer.setInitialDelay(0);
        timer.start();      
    }

    @Override
    public void paint(Graphics g) 
    {
        super.paint(g);
        System.out.println("******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n******PAINT******\n");
        Graphics2D g2d = (Graphics2D) g;
        paintCell(g, 1);  //eventually, I want to call this method for every "cell" in the program
        g.drawLine(30, 30, 80, 80);  //this line's basically a test to see if I can display anything at all
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }


      public void actionPerformed(ActionEvent e) {
        repaint();
    }

    public void paintCell(Graphics graphics, int cellNumber)
    {
        graphics.setColor(Color.black);
        graphics.fillOval((int)(graphSize*xCoordinates[cellNumber]/size), (int)(graphSize*yCoordinates[cellNumber]/size), 5, 5);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for(int i = 0; i < types.length; i++)
            paintCell(g, i);
    }


    public static void spendTime()
    {
        //advances the iteration counter and recalculates the coordinates of all the cells
    }

}

最终,我希望程序在计时器的每次迭代中为模拟中的每个单元调用paintCell(),每个单元代表一个移动对象。但是现在,屏幕仍为空白。对于记录,我通过System.out.println()调用paint()调用的消息不会显示。 想法?

1 个答案:

答案 0 :(得分:2)

  

我一直在尝试使用在线发现的示例中的代码,但我仍然缺少一些东西......

不要在Swing程序中使用AWT建议。 Swing与AWT不同。不要使用Panel。在Swing中,您使用JPanel。在Swing中,覆盖paintComponent()方法,而不是paint()方法。现在你的代码试图覆盖这两种方法。

阅读Custom Painting上的Swing教程,了解更多信息和正确的示例。

frame.setSize(graphSize, graphSize);

不要使用frame.setSize(),帧大小包括边框和标题栏,因此您的图形将不是您想要的大小。相反,覆盖执行自定义绘制的JPanel的getPreferredSize()以返回面板的大小。然后你会做frame.pack()

但面板未显示的原因是因为您没有将面板添加到框架中。

//frame.add(panel, BorderLayout.CENTER);
frame.add(pop, BorderLayout.CENTER);

由于标签没有价值,下面的代码什么都不做。您应该使用JPanel,但不需要面板,因为您可以直接将标签添加到框架的内容窗格中。

lbl = new JLabel();
Panel panel = new Panel();
panel.add(lbl);