Strange JFrame Behavior

前端 未结 3 485
长情又很酷
长情又很酷 2020-12-12 02:00

I have the following program which has some very strange and unwanted behavior when it runs. Its supposed to have two buttons, \"Start\" and \"Stop, but when I click \"Start

3条回答
  •  再見小時候
    2020-12-12 02:30

    I fixed your button problem on my Windows XP computer by invoking SwingUtilities.

    I formatted your Java code.

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class TwoButtonsTest implements Runnable {
    
        JFrame frame;
        Timer timer;
        boolean isClicked;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TwoButtonsTest());
        }
    
        @Override
        public void run() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(500, 500);
    
            JButton startButton = new JButton("Start");
            startButton.addActionListener(new StartListener());
            JButton stopButton = new JButton("Stop");
            stopButton.addActionListener(new StopListener());
    
            final DrawPanel myDraw = new DrawPanel();
    
            frame.getContentPane().add(BorderLayout.CENTER, myDraw);
            frame.getContentPane().add(BorderLayout.NORTH, startButton);
            frame.getContentPane().add(BorderLayout.SOUTH, stopButton);
    
            frame.setVisible(true);
    
            timer = new Timer(50, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    myDraw.repaint();
                }
            });
        }
    
        class StartListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                // needs to be implemented
                if (!isClicked) {
                }
                isClicked = true;
                timer.start();
            }
        }
    
        class StopListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                // needs to be implemented
                timer.stop();
                isClicked = false;
            }
        }
    
        class DrawPanel extends JPanel {
            @Override
            public void paintComponent(Graphics g) {
                int red = (int) (Math.random() * 256);
                int blue = (int) (Math.random() * 256);
                int green = (int) (Math.random() * 256);
    
                g.setColor(new Color(red, blue, green));
    
                Random rand = new Random();
                // following 4 lines make sure the rect stays within the frame
                int ht = rand.nextInt(getHeight());
                int wd = rand.nextInt(getWidth());
    
                int x = rand.nextInt(getWidth() - wd);
                int y = rand.nextInt(getHeight() - ht);
    
                g.fillRect(x, y, wd, ht);
            }
        } // close inner class
    }
    

    To clean the screen when you press the Start button, you're going to have to add some methods to your DrawPanel class.

    Here's one way to do it.

    class DrawPanel extends JPanel {
            protected boolean eraseCanvas;
    
            public void setEraseCanvas(boolean eraseCanvas) {
                this.eraseCanvas = eraseCanvas;
            }
    
            @Override
            public void paintComponent(Graphics g) {
                if (eraseCanvas) {
                    g.setColor(Color.WHITE);
                    g.fillRect(0,  0, getWidth(), getHeight());
                } else {
                    int red = (int) (Math.random() * 256);
                    int blue = (int) (Math.random() * 256);
                    int green = (int) (Math.random() * 256);
    
                    g.setColor(new Color(red, blue, green));
    
                    Random rand = new Random();
                    // following 4 lines make sure the rect stays within the frame
                    int ht = rand.nextInt(getHeight());
                    int wd = rand.nextInt(getWidth());
    
                    int x = rand.nextInt(getWidth() - wd);
                    int y = rand.nextInt(getHeight() - ht);
    
                    g.fillRect(x, y, wd, ht);
                }
            }
        } // close inner class
    

提交回复
热议问题