簡體   English   中英

Java重繪方法不起作用,為什么?

[英]Java repaint method do not working ,why?

我的英語不太好,但是我會盡力解釋。

我是第一班和第二班兩個班(第二班叫“格拉菲卡”)。

我希望我的矩形移動到我被點擊的位置,但是顯然他不動,我不明白為什么,請幫助。

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


    }

}

您在該代碼中遇到了幾個問題:

  • 您正在創建一個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();
        });
    }

}

您可能需要將鼠標偵聽器添加到組件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM