Java 重绘方法不起作用,为什么?

问题描述 投票:0回答:3

我的英语不太好,但我会尽力解释。

我被分了两个班,一等班和二等班(第二班被命名为“Grafika”)。

我希望我的矩形移动到我被单击的位置,但显然他没有移动,我不明白为什么,请帮忙。

import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.*;
    public class Grafika extends JPanel implements MouseListener{
        static int x=0,y=0;
        @Override
    public void paintComponent(Graphics g){
        g.setColor(Color.BLACK);
        g.fillRect(x, y, 20, 30);
    }

    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub``
        x=arg0.getX();
        y=arg0.getY();
        this.repaint(x, y, 20, 30);
    }

我将向您展示完整的代码,它很小。这是第二类。我的(我认为)唯一的问题是 repaint() 方法。为什么我不知道:D .

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class Grafika extends JPanel implements MouseListener{
    static int x=0,y=0;
    @Override
public void paintComponent(Graphics g){
    g.setColor(Color.BLACK);
    g.fillRect(x, y, 20, 30);
}

public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub
    x=arg0.getX();
    y=arg0.getY();
    this.repaint(x, y, 20, 30);
}

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

}

}

现在我将向您展示我所说的二等舱的位置。

import java.awt.*;
import javax.swing.*;
public class Glavna extends Grafika {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
     Grafika g=new Grafika();
     JFrame wi=new JFrame("Grafika");
     wi.setBounds(50, 50, 500, 600);
     wi.add(g);
     wi.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     wi.setVisible(true);


    }

}
java swing paintcomponent mouselistener
3个回答
5
投票

该代码中存在几个问题:

  • 您正在创建一个 MouseListener(您仍然缺少几个接口的方法),但我没有看到您将其添加到 GUI 的任何地方。您的代码中必须有
    addMouseListener(this);
    才能让侦听器工作。
  • 重绘本身不会移动矩形。更改 X 和 Y 确实如此,但同样,如果不先添加 MouseListener,则必须这样做。
  • 您可能想调用不带参数的
    repaint();
    来绘制整个组件。否则旧的矩形可能不会被删除。
  • 您的paintComponent方法应该调用
    super.paintComponent(g);
    作为您的重写方法的第一个方法调用。如果没有这个,你将不会删除旧的矩形,并且你会破坏绘画链,这可能会在子组件中产生绘画副作用。

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class Grafika extends JPanel {
    private static final int RECT_W = 20;
    private static final int RECT_H = 30;
    private static final int PREF_W = 600;
    private static final int PREF_H = PREF_W;
    private static final Color MY_COLOR = Color.RED;    
    private int myX = 0;
    private int myY = 0;

    public Grafika() {
        MyMouse myMouse = new MyMouse();
        addMouseListener(myMouse);  // add MouseListener
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);  // **MUST** call this 
        g.setColor(MY_COLOR);
        g.fillRect(myX, myY, RECT_W, RECT_H);
    }

    private class MyMouse extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            myX = e.getX();
            myY = e.getY();
            repaint(); // repaint the whole JPanel
        }
    }

    @Override  // to make the GUI larger
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        Grafika mainPanel = new Grafika();

        JFrame frame = new JFrame("Grafika");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }

}

如果你想变得更有趣并开始拖动方块:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class Grafika extends JPanel {
    private static final int RECT_W = 20;
    private static final int RECT_H = RECT_W;
    private static final int PREF_W = 600;
    private static final int PREF_H = PREF_W;
    private static final Color MY_COLOR = Color.RED;
    private int myX = 0;
    private int myY = 0;

    public Grafika() {
        MyMouse myMouse = new MyMouse();
        addMouseListener(myMouse);
        addMouseMotionListener(myMouse);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(MY_COLOR);
        g.fillRect(myX, myY, RECT_W, RECT_H);
    }

    private class MyMouse extends MouseAdapter {

        public void mousePressed(MouseEvent e) {
            moveRect(e);
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            moveRect(e);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            moveRect(e);
        }

        private void moveRect(MouseEvent e) {
            myX = e.getX() - RECT_W / 2;
            myY = e.getY() - RECT_H / 2;
            repaint();
        }

    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        Grafika mainPanel = new Grafika();

        JFrame frame = new JFrame("Grafika");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }

}

1
投票

你必须为组件添加鼠标监听器

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
public class Grafika extends JPanel implements MouseListener{
    static int x=0,y=0;

public Grafika(){
    super();
    addMouseListener(this); // add to constructor
}

@Override
public void paintComponent(Graphics g){
    g.setColor(Color.BLACK);
    g.fillRect(x, y, 20, 30);
}

public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub``
    x=arg0.getX();
    y=arg0.getY();
    this.repaint(x, y, 20, 30);
}

0
投票

对我来说,问题是通过改变背景解决的。在那之前我没有看到重画有任何变化。

public void clear() {
    setBackground(new Color(0, true));
    repaint();
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.