Belisha Beacon计划中的JButton查询

时间:2016-04-15 15:27:40

标签: java swing jbutton

基本上我的Belisha Beacon必须保持橙色,当我点击Steady按钮时,但在我的程序中,当我点击Steady Button时,Beacon保持为浅灰色。有人可以请说明我出错的地方吗?谢谢你:)这是我的代码:

package Homework;


import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BelishaBeacon {
    private static Timer timer;
    public class Drawing extends JPanel {

        private int x = 125;
        private int y = 80;
        private boolean changeColors = false;


        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            Rectangle box1 = new Rectangle(165, 180, 20, 45);
            Rectangle box2 = new Rectangle(165, 225, 20, 45);
            Rectangle box3 = new Rectangle(165, 270, 20, 45);
            Rectangle box4 = new Rectangle(165, 315, 20, 45);
            Rectangle box5 = new Rectangle(165, 360, 20, 45);
            Rectangle box6 = new Rectangle(165, 405, 20, 45);


            Ellipse2D.Double ball = new Ellipse2D.Double(x, y, 100, 100);
            g2.draw(ball);
            g2.draw(box1);
            g2.draw(box2);
            g2.draw(box3);
            g2.draw(box4);
            g2.draw(box5);
            g2.draw(box6);

            g2.setColor(Color.BLACK);
            g2.fill(box1);
            g2.fill(box3);
            g2.fill(box5);
            g2.setColor(Color.ORANGE);
            g2.fill(ball);
            changeColors = !changeColors;
            if (changeColors) {
                g2.setColor(Color.lightGray);
                g2.fill(new Ellipse2D.Double(x, y, 100, 100));
            }
        }




        public void changeColors() {
            changeColors = true;
            repaint();
        }
    }

    public BelishaBeacon() {

        JFrame frame = new JFrame();
        frame.setSize(350, 570);
        frame.setTitle("Belisha Beacon");
        frame.setLayout(new BorderLayout(0, 0));
        final Drawing shapes = new Drawing();

        timer = new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                shapes.repaint();
            }
        });



        JButton jbtFlash = new JButton("Flash");
        jbtFlash.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Flashing");
                if (!timer.isRunning()) {
                    timer.start();
                }

            }
        });




        final JButton jbtSteady = new JButton("Steady");
        jbtSteady.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {

                        timer.stop();
                    }
                });


        JPanel controlPanel = new JPanel();
        controlPanel.setLayout(new GridLayout(1, 2, 0, 0));
        controlPanel.add(jbtFlash);
        controlPanel.add(jbtSteady);

        frame.add(controlPanel, BorderLayout.SOUTH);
        frame.add(shapes);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new BelishaBeacon();
        timer.start();
    }
}

2 个答案:

答案 0 :(得分:2)

试试这个:

public class BelishaBeacon {
    private static Timer timer;
    public class Drawing extends JPanel {

        private int x = 125;
        private int y = 80;
        private boolean changeColors = false;


        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            Rectangle box1 = new Rectangle(165, 180, 20, 45);
            Rectangle box2 = new Rectangle(165, 225, 20, 45);
            Rectangle box3 = new Rectangle(165, 270, 20, 45);
            Rectangle box4 = new Rectangle(165, 315, 20, 45);
            Rectangle box5 = new Rectangle(165, 360, 20, 45);
            Rectangle box6 = new Rectangle(165, 405, 20, 45);


            Ellipse2D.Double ball = new Ellipse2D.Double(x, y, 100, 100);
            g2.draw(ball);
            g2.draw(box1);
            g2.draw(box2);
            g2.draw(box3);
            g2.draw(box4);
            g2.draw(box5);
            g2.draw(box6);

            g2.setColor(Color.BLACK);
            g2.fill(box1);
            g2.fill(box3);
            g2.fill(box5);
            g2.setColor(Color.ORANGE);
            g2.fill(ball);
           // changeColors = !changeColors;
            if (changeColors) {
                g2.setColor(Color.lightGray);
                g2.fill(new Ellipse2D.Double(x, y, 100, 100));
            }
        }




        public void changeColors() {
            changeColors = !changeColors;
            repaint();
        }

        public boolean getChangeColors() {
            return changeColors;
        }
    }

    public BelishaBeacon() {

        JFrame frame = new JFrame();
        frame.setSize(350, 570);
        frame.setTitle("Belisha Beacon");
        frame.setLayout(new BorderLayout(0, 0));
        final Drawing shapes = new Drawing();

        timer = new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //shapes.repaint();
                shapes.changeColors();
            }
        });



        JButton jbtFlash = new JButton("Flash");
        jbtFlash.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Flashing");
                if (!timer.isRunning()) {
                    timer.start();
                }

            }
        });




        final JButton jbtSteady = new JButton("Steady");
        jbtSteady.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {

                        timer.stop();
                        if(shapes.getChangeColors()) {
                            shapes.changeColors();
                        }
                    }
                });


        JPanel controlPanel = new JPanel();
        controlPanel.setLayout(new GridLayout(1, 2, 0, 0));
        controlPanel.add(jbtFlash);
        controlPanel.add(jbtSteady);

        frame.add(controlPanel, BorderLayout.SOUTH);
        frame.add(shapes);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new BelishaBeacon();
        timer.start();
    }
}

答案 1 :(得分:2)

不要试图切换 override func prepareForReuse() { self.questionLabel.text = nil self.questionAnswer.on = data?.answer } 中的颜色,而是paintComponent() Drawing并使用它来渲染球:

Color

private Color color = Color.lightGray; @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; … g2.setColor(color); g2.fill(ball); … } 实际改变颜色:

changeColors()

并添加 public void changeColors() { if (Color.orange.equals(color)) { color = Color.lightGray; } else { color = Color.orange; } repaint(); } 方法:

makeSteady()

现在,你的计时器的动作可以只做public void makeSteady() { color = Color.orange; repaint(); } ,你的 Flash 按钮处理程序可以只做shapes.changeColors()而你的 Steady 按钮处理程序就可以了这样做:

timer.restart()

另外,不要忘记invokeLater()