-1

有人可以帮我处理评论行,除了它要求删除的那些。谢谢!

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

}
4

1 回答 1

2

很简单,不要休眠/暂停/阻塞或以其他方式阻碍事件调度线程。

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

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

相反,使用javax.swing.Timer

请查看Swing 中的并发执行自定义绘画以及在 AWT 和 Swing中绘画以了解更多详细信息。

我还强烈建议您不要覆盖任何paint顶级容器的方法,例如JApplet. 相反,使用类似的东西JPanel并覆盖它的paintComponent方法。

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

例如...

用简单的例子

在此处输入图像描述

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();
        }
    }
}
于 2013-09-23T03:24:04.283 回答