简体   繁体   English

Java:在静态上下文中调用repaint()(或如何避免它)

[英]Java: Calling repaint() in static context (Or how to avoid it)

I am working on a simple app Java/Swing, which involves having the user click on a box and drag it around. 我正在开发一个简单的Java / Swing应用程序,其中涉及让用户单击一个框并将其拖动。 I am having troubles with understanding how the repaint method can be used. 我在理解如何使用重绘方法时遇到麻烦。 I created this example of the problem, in which a square is drawn and then on mousePressed it gets the x cordinates of the click, and displaces the original drawing by however much the pointer is moved. 我创建了这个问题的示例,在该示例中先绘制一个正方形,然后在mousePressed上获取单击的x坐标,然后将原始图形移动多少指针。

I have read the commonly referred guides on drawing in Swing, but I haven't seen any answers to the question on how to write a program that incorporates both mouseMotion and mouseListener (which as far as I can tell means that the mouseListener must be implemented as its own class, as opposed to the common solution of incorporating it into the custom JPanel class) and also calls repaint() based on mouse actions. 我已经阅读了有关在Swing中进行绘图的常用指南,但是对于如何编写一个包含mouseMotion和mouseListener的程序的问题,我还没有看到任何答案(据我所知,这意味着必须实现mouseListener作为其自己的类,而不是将其合并到自定义JPanel类的常见解决方案),并且还基于鼠标操作调用repaint()

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.MouseInputAdapter;


class drawTest extends JPanel {
    static int xpos_square = 200; 
    static int ypos_square = 200; 
    int width = 100;  
    int height = 100;

    static int x_init;
    static int y_init;

    public drawTest(){
        addMouseListener(new mouseListener());
        addMouseMotionListener(new mouseListener());
        setBackground(Color.BLACK); 
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawSquare(g);
    }

    public void drawSquare(Graphics g){
        g.setColor(Color.GREEN);
        g.fillRect(xpos_square, ypos_square, height, width);            
    }   

    public static void moveShape(int x, int y){
        xpos_square += x-x_init;
        ypos_square += y-y_init;
        repaint();
    }
    public static void getChord(int x, int y){
        x_init = x;
        y_init = y;     
    }
}   

class mouseListener extends MouseInputAdapter{

    public void mousePressed(MouseEvent e){     
        drawTest.getChord(e.getX(),e.getY());
    }   

    public void mouseDragged(MouseEvent e){
        drawTest.moveShape(e.getX(),e.getY());
    }       
}

public class myTest {

    JFrame myFrame = new JFrame();
    JPanel myDrawing = new drawTest();

    public myTest () {
        myFrame.add(myDrawing);
        myFrame.setSize(500,500);
        myFrame.setVisible(true);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }   

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

The issue is of course that repaint() cannot be called in a static context. 问题当然是不能在静态上下文中调用repaint() However, I don't see how I can avoid this, since if I want the position to smoothly update, it has to be called via the mouseDragged method. 但是,我看不到如何避免这种情况的发生,因为如果我希望位置平稳更新,则必须通过mouseDragged方法调用它。

How else could I use the repaint() method to redraw based on mouse movements? 我还能如何使用repaint()方法根据鼠标移动来重绘?

So I figured out a way around it, using anonymous methods in addMouseListener. 因此,我想出了一种解决方法,可以在addMouseListener中使用匿名方法。 This bypasses the need for static methods in the call to repaint. 这避免了在重画调用中对静态方法的需要。 If anyone else has a similar question, maybe they will find it helpful. 如果其他人有类似的问题,也许他们会觉得有帮助。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.MouseInputAdapter;


class DrawTest extends JPanel {
    static int xpos_square = 200; 
    static int ypos_square = 200; 
    int width = 100;  
    int height = 100;

    static int x_init;
    static int y_init;

    public DrawTest(){
        addMouseListener(new mouseListener(){   public void mousePressed(MouseEvent e){     
            getClick(e.getX(),e.getY());
        }});
        addMouseMotionListener(new mouseListener(){ public void mouseDragged(MouseEvent e){
            moveShape(e.getX(),e.getY());   
        }});
        setBackground(Color.BLACK); 
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawSquare(g);
    }

    public void drawSquare(Graphics g){
        g.setColor(Color.GREEN);
        g.fillRect(xpos_square, ypos_square, height, width);            
    }   

    public void moveShape(int x, int y){
        if((x >= xpos_square)&&(x <= xpos_square + width)&&(y >= ypos_square)&&(y <= ypos_square + height)){
            xpos_square += x-x_init;
            ypos_square += y-y_init;
            x_init = x;
            y_init = y; 
            repaint();
        }
    }
    public void getClick(int x, int y){
        x_init = x;
        y_init = y;     
    }
}

public class MyTest {

    JFrame myFrame = new JFrame();
    JPanel myDrawing = new DrawTest();

    public MyTest () {
        myFrame.add(myDrawing);
        myFrame.setSize(500,500);
        myFrame.setVisible(true);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }   

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

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

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