gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:29:27 24 4
gpt4 key购买 nike

我正在开发一个简单的 Java/Swing 应用程序,其中涉及让用户单击一个框并将其拖动。我无法理解如何使用重绘方法。我创建了这个问题的示例,其中绘制了一个正方形,然后在 mousePressed 上它获取单击的 x 坐标,并根据指针移动的距离来替换原始图形。

我已经阅读了有关 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();
}
}

问题当然是 repaint() 无法在静态上下文中调用。但是,我不知道如何避免这种情况,因为如果我希望位置顺利更新,则必须通过 mouseDragged 方法调用它。

我还能如何使用repaint()方法根据鼠标移动进行重绘?

最佳答案

所以我找到了一种解决方法,在 addMouseListener 中使用匿名方法。这绕过了调用重绘时对静态方法的需要。如果其他人有类似的问题,也许他们会发现它很有帮助。

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();
}
}

关于Java:在静态上下文中调用 repaint() (或如何避免它),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49384166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com