线程帮助。涂料

时间:2013-09-23 03:17:47

标签: java multithreading swing java-2d japplet

除了要求删除的内容之外,有人可以帮我评论一下。谢谢!

public class ex1011c extends JApplet implements ActionListener
{
        // get rid of all winkbutton code

    JButton winkbutton = new JButton("Wink At You");
    boolean wink = false, first = true;
    Container c;

    public void init()
    {
        c = getContentPane();
        c.setLayout(new FlowLayout());
        c.setBackground(Color.blue);
        winkbutton.setForeground(Color.cyan);
        c.add(winkbutton);
        winkbutton.addActionListener(this);
    }

        // get rid of actionPerformed

    public void actionPerformed(ActionEvent e)
    {
        wink = !wink;
        repaint();
    }

    public void paint(Graphics g)
    {
        /* if first time, draw the face and non winking eye,
            set first to false */

        super.paint(g);
        g.setColor(Color.yellow);
        g.fillOval(50, 50, 100, 100);
        g.setColor(Color.black);
        g.fillOval(85, 80, 10, 20);

        /* cover just the eye that winks (if winking or not, but do not
         cover anything else), switch the wink boolean */

        // draw the full eye or winking eye

        if (wink)
            g.fillOval(105, 88, 10, 5);
        else
            g.fillOval(105, 80, 10, 20);

        // go to sleep for a second

        // call repaint
    }

        // override update to lesson flicker

}

1 个答案:

答案 0 :(得分:2)

简单,不要睡眠/暂停/阻止或以其他方式阻止事件调度线程。

EDT,除其他外,负责流程绘制请求,任何阻止它运行的东西(如Thread.sleep)都会阻止它更新屏幕。

请记住,仅仅因为你在Graphics上下文中绘制内容,并不意味着它会被渲染到输出中。

相反,请使用javax.swing.Timer

请查看Concurrency in SwingPerforming Custom PaintingPainting in AWT and Swing了解详情。

我还强烈建议您不要覆盖paint等顶级容器的任何JApplet方法。相反,请使用JPanel之类的内容,并改为使用paintComponent方法。

除了可饮用性之外,您还可以获得顶级容器所没有的双缓冲​​效果......

例如......

使用简单示例

enter image description here

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Blinky {

    public static void main(String[] args) {
        new Blinky();
    }

    public Blinky() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BlinkPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class BlinkPane extends JPanel {

        private boolean wink;

        public BlinkPane() {
            Timer timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    wink = !wink;
                    repaint();
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            int x = (getWidth() - 10) / 2;
            int eyeHeight = 20;
            if (wink) {
                eyeHeight = 5;
            }
            int y = (getWidth() - eyeHeight) / 2;
            g.fillOval(x, y, 10, eyeHeight);
            g2d.dispose();
        }
    }
}