简体   繁体   English

Repaint()没有在Java中调用paint()

[英]Repaint() not calling paint() in Java

Let me start off by saying I know I've violated some basic Java principles in this messy code, but I'm desperately trying to finish a program by Tuesday for a social science experiment, and I don't know Java, so I'm basically just fumbling through it for now. 让我先说我知道我在这个凌乱的代码中违反了一些基本的Java原则,但是我很想在星期二之前完成一个程序用于社会科学实验,而且我不懂Java,所以我'我现在基本上只是摸索它。

With that disclaimer out of the way, I have a separate program working where a circle is moving around the screen and the user must click on it. 通过该免责声明,我有一个单独的程序工作,其中一个圆圈在屏幕上移动,用户必须点击它。 It works fine when its in its own separate class file, but when I add the code to my main program, it's no longer working. 它在它自己独立的类文件中工作正常,但是当我将代码添加到我的主程序时,它不再有效。 I don't even really understand why repaint() calls my paint() function — as far as I'm concerned, it's magic, but I've noticed that repaint() calls paint() in my test program, but not in the more complicated actual program, and I assume that's why the circle is no longer painting on my program. 我甚至不明白为什么repaint()调用我的paint()函数 - 就我而言,它是神奇的,但我注意到repaint()在我的测试程序中调用paint(),但不是更复杂的实际程序,我认为这就是为什么圆圈不再在我的程序上绘画。

Entire code is below: 整个代码如下:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;

public class Reflexology1 extends JFrame{

private static final long serialVersionUID = -1295261024563143679L;
private Ellipse2D ball = new Ellipse2D.Double(0, 0, 25, 25);
private Timer moveBallTimer;
int _ballXpos, _ballYpos;
JButton button1, button2;
JButton movingButton;
JTextArea textArea1;
int buttonAClicked, buttonDClicked;
private long _openTime = 0;
private long _closeTime = 0;
JPanel thePanel = new JPanel();
JPanel thePlacebo = new JPanel();
final JFrame frame = new JFrame("Reflexology");
final JFrame frame2 = new JFrame("The Test");
JLabel label1 = new JLabel("Press X and  then click the moving dot as fast as you can.");

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

public Reflexology1(){
    frame.setSize(600, 475);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Reflexology 1.0");
    frame.setResizable(false);

    frame2.setSize(600, 475);
    frame2.setLocationRelativeTo(null);
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame2.setTitle("Reflexology 1.0");
    frame2.setResizable(false);

    button1 = new JButton("Accept");
    button2 = new JButton("Decline");
    //movingButton = new JButton("Click Me");

    ListenForAcceptButton lForAButton = new ListenForAcceptButton();
    ListenForDeclineButton lForDButton = new ListenForDeclineButton();
    button1.addActionListener(lForAButton);
    button2.addActionListener(lForDButton);
    //movingButton.addActionListener(lForMButton);

    JTextArea textArea1 = new JTextArea(24, 50);

    textArea1.setText("Tracking Events\n");
    textArea1.setLineWrap(true);
    textArea1.setWrapStyleWord(true);
    textArea1.setSize(15, 50);
    textArea1.setEditable(false);

    FileReader reader = null;
    try {
        reader = new FileReader("EULA.txt");
        textArea1.read(reader, "EULA.txt");
    } catch (IOException exception) {
        System.err.println("Problem loading file");
        exception.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException exception) {
                System.err.println("Error closing reader");
                exception.printStackTrace();
            }
        }

    }

    JScrollPane scrollBar1 = new JScrollPane(textArea1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    AdjustmentListener listener = new MyAdjustmentListener();

    thePanel.add(scrollBar1);
    thePanel.add(button1);
    thePanel.add(button2);

    frame.add(thePanel);
    ListenForMouse lForMouse = new ListenForMouse();
    thePlacebo.addMouseListener(lForMouse);
    thePlacebo.add(label1);
    frame2.add(thePlacebo);

    ListenForWindow lForWindow = new ListenForWindow();
    frame.addWindowListener(lForWindow);
    frame2.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e){
            if(e.getKeyChar() == 'X' || e.getKeyChar() == 'x') {moveBallTimer.start();}
        }
    });
    frame.setVisible(true);

       moveBallTimer = new Timer(1000, new ActionListener() {
           public void actionPerformed(ActionEvent e) {
           moveBall();
           System.out.println("Timer started!");
           repaint();
          }
        });

        addKeyListener(new KeyAdapter() {
          public void keyPressed(KeyEvent e) {
                if(frame2.isVisible()){ moveBallTimer.start(); }
          }
        });

}



private class ListenForAcceptButton implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == button1){
            Calendar ClCDateTime = Calendar.getInstance();
            System.out.println(ClCDateTime.getTimeInMillis() - _openTime);
            _closeTime = ClCDateTime.getTimeInMillis() - _openTime;
            //frame.getContentPane().remove(thePanel);
            //thePlacebo.addKeyListener(lForKeys);
            //frame.getContentPane().add(thePlacebo);

            //frame.repaint();
            //moveBallTimer.start();
            frame.setVisible(false);
            frame2.setVisible(true);
            frame2.revalidate();
            frame2.repaint();


            }
        }
    }


private class ListenForDeclineButton implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if (e.getSource() == button2){
            JOptionPane.showMessageDialog(Reflexology1.this, "You've declined the license agreement. DO NOT RESTART  the program. Please go inform a researcher that you have declined the agreement.", "WARNING", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
        }
    }
}


private class ListenForWindow implements WindowListener{

    public void windowActivated(WindowEvent e) {
            //textArea1.append("Window is active");

    }

    // if this.dispose() is called, this is called:
    public void windowClosed(WindowEvent arg0) {

    }

    // When a window is closed from a menu, this is called:
    public void windowClosing(WindowEvent arg0) {

    }

    // Called when the window is no longer the active window:
    public void windowDeactivated(WindowEvent arg0) {
        //textArea1.append("Window is NOT active");

    }

    // Window gone from minimized to normal state
    public void windowDeiconified(WindowEvent arg0) {
        //textArea1.append("Window is in normal state");

    }

    // Window has been minimized
    public void windowIconified(WindowEvent arg0) {
        //textArea1.append("Window is minimized");

    }

    // Called when the Window is originally created
    public void windowOpened(WindowEvent arg0) {
        //textArea1.append("Let there be Window!");
        Calendar OlCDateTime = Calendar.getInstance();
         _openTime = OlCDateTime.getTimeInMillis();
        //System.out.println(_openTime);

    }

}


private class MyAdjustmentListener implements AdjustmentListener {

    public void adjustmentValueChanged(AdjustmentEvent arg0) {
        AdjustmentEvent scrollBar1;
        //System.out.println(scrollBar1.getValue()));

    }

}

  public void paint(Graphics g) {
        //super.paint(g);
          frame2.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fill(ball);
        System.out.println("Calling fill()");
      }

  protected void moveBall() {
        //System.out.println("I'm in the moveBall() function!");
        int width = getWidth();
        int height = getHeight();
        int min, max, randomX, randomY;
        min =200;
        max = -200;
        randomX = min + (int)(Math.random() * ((max - min)+1));
        randomY = min + (int)(Math.random() * ((max - min)+1));
       //System.out.println(randomX + ", " + randomY);

        Rectangle ballBounds = ball.getBounds();
        //System.out.println(ballBounds.x + ", " + ballBounds.y);
        if (ballBounds.x + randomX < 0) {
            randomX = 200;
        } else if (ballBounds.x + ballBounds.width + randomX > width) {
            randomX = -200;
        }
        if (ballBounds.y + randomY < 0) {
            randomY = 200;
        } else if (ballBounds.y + ballBounds.height + randomY > height) {
            randomY = -200;
        } 

        ballBounds.x += randomX;
        ballBounds.y += randomY;
        _ballXpos = ballBounds.x;
        _ballYpos = ballBounds.y;
        ball.setFrame(ballBounds);
      }



      public void start() {
        moveBallTimer.start();
      }

      public void stop() {
        moveBallTimer.stop();
      }

      private class ListenForMouse implements MouseListener{

            // Called when the mouse is clicked
            public void mouseClicked(MouseEvent e) {
                //System.out.println("Mouse Panel pos: " + e.getX() + " " + e.getY() + "\n");
                if (e.getX() >=_ballXpos && e.getX() <= _ballXpos + 25 && e.getY() <=_ballYpos && e.getY() >= _ballYpos - 25 ) { 
                    System.out.println("TRUE"); 
                }
            System.out.println("{e.getX(): " + e.getX() + " / " + "_ballXpos: " + _ballXpos + " | " +  "{e.getY(): " + e.getY() + " / " + "_ballYpos: " + _ballYpos);

            }

            public void mouseEntered(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            public void mouseExited(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            public void mousePressed(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            public void mouseReleased(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }
                }
            //    System.out.println("e.getX(): " + e.getX() + " / " + "_ballXpos: " + _ballXpos);



            // Mouse over
            public void mouseEntered(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            // Mouse left the mouseover area:
            public void mouseExited(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            public void mousePressed(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }

            public void mouseReleased(MouseEvent arg0) {
                // TODO Auto-generated method stub

            }



    }

Could anyone tell me what I need to do to get repaint() to call the paint() method in the above program? 谁能告诉我我需要做什么才能让repaint()在上面的程序中调用paint()方法? I'm assuming the multiple frames is causing the problem, but that's just a guess. 我假设多帧导致问题,但这只是一个猜测。 Thanks. 谢谢。

You should not paint directly on JFrame . 你不应该直接在JFrame上绘画。 JPanel or extension of JComponent should be used. 应使用JPanelJComponent扩展。 For painting override paintComponent() rather than paint() . 用于绘制覆盖paintComponent()而不是paint() Don't forget to call super.paintComponent(g); 别忘了调用super.paintComponent(g); .

Also, keep in mind that repaint() only schedules component update, it does not trigger immediate paint() . 另外,请记住repaint()仅调度组件更新,它不会立即触发paint()

For more details see Performing Custom Painting and Painting in AWT and Swing . 有关更多详细信息,请参阅在AWT和Swing中 执行自定义绘画绘画

For example you can apply the following changes. 例如,您可以应用以下更改。 TestPanel will paint the ball. TestPanel将绘制球。

class TestPanel extends JPanel {
    @Override
  public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fill(ball);
      }
}

Then, update thePlacebo panel: 然后,更新thePlacebo面板:

JPanel thePlacebo = new TestPanel();

Add repaint in moveBall() : moveBall()添加重绘:

thePlacebo.repaint();

Here is an example based on original code: 以下是基于原始代码的示例:

package so;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.Random;

import javax.swing.*;

public class TestBall {
    private static void createAndShowUI() {
        final TestPanel panel = new TestPanel();
        panel.validate();
        JFrame frame = new JFrame("TestBall");
        frame.getContentPane().add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(300, 300));
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        ActionListener timerAction = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                panel.moveBall();
            }
        };
        Timer timer = new Timer(1000, timerAction);
        timer.setRepeats(true);
        timer.start();
    }

    static class TestPanel extends JPanel {
        public static int BALL_SIZE = 25;
        private Ellipse2D ball = new Ellipse2D.Double(0, 0, BALL_SIZE,
                BALL_SIZE);
        Random rand = new Random();

        public TestPanel() {
            this.addMouseListener(new MouseAdapter() {
                // Called when the mouse is clicked
                public void mouseClicked(MouseEvent e) {
                    if (ball.contains(e.getPoint())) {
                        System.out.println("hit the ball");
                    }
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.RED);
            g2d.fill(ball);
        }

        public void moveBall() {
            Rectangle ballBounds = ball.getBounds();
            ball.setFrame(ballBounds);
            ballBounds.x = rand.nextInt(getWidth() - BALL_SIZE + 1) + 1;
            ballBounds.y = rand.nextInt(getHeight() - BALL_SIZE + 1) + 1;
            ball.setFrame(ballBounds);
            repaint();
        }
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM