2016-05-31 12 views
1

I bestimmten Bereich auf JPanel zeichnen möchten, wie dieser (schwarzer Bereich ist, wo ich JPanel werden neu gestrichen wollen):java neu streichen mehrere Bereich

enter image description here

Below-Code ist, wie ich dies implementiert. Es folgt dem Mauszeiger und zeichnet einen Kreis am Mauszeigerpunkt. Die Größe des Rahmens und der Platte ist 300 * 300.

public class MiniGraphicTest extends JPanel{ 

private static final long serialVersionUID = 1L; 

public int x,y; 
public MiniGraphicTest() { 
    super(); 
    x = -1; 
    y = -1; 
    addMouseMotionListener(new MouseMotionAdapter(){ 
     @Override 
     public void mouseMoved(MouseEvent m){ 
      x = m.getX()-25; 
      y = m.getY()-25; 
      repaint(100,100,100,100); 
      repaint(200,200,100,100); 
     } 
    }); 
} 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    ////////////////////// 
    //DO NOT MODIFY HERE// 
    ////////////////////// 
    //Draw gridline 
    int width = this.getWidth(); 
    int height = this.getHeight(); 
    g.setColor(Color.BLACK); 
    for(int i=100;i<width;i+=100){ 
     g.drawLine(i, 0, i, height); 
    } 
    for(int i=100;i<height;i+=100){ 
     g.drawLine(0, i, width, i); 
    } 
    ////////////////////// 
    //put test code here// 
    ////////////////////// 
    if(x == -1&&y==-1) return;//initially draw nothing 
    g.fillOval(x, y, 50, 50); 
} 
}//main function is just showing the panel. nothing special 
public static void main(String[] args) { 
    JFrame jf = new JFrame("Test"); 
    MiniGraphicTest test = new MiniGraphicTest(); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    test.setPreferredSize(new Dimension(300, 300)); 
    jf.setResizable(false); 
    jf.add(test); 
    jf.pack(); 
    jf.setVisible(true); 
} 

Das Ergebnis dieser Code ist wie folgt:

enter image description here

Es frischt außerhalb des Bereichs neu gestrichen werden. Kannst du mir erklären, warum das passiert ist und wie du das lösen kannst?

PS. Der Code funktioniert vollständig, wenn nur ein einzelnes Repaint (100, 100, 100, 100) in mouseMoved aufgerufen wird.

Danke

+1

Sehen Sie, ob dieses Thema Ihnen helfen kann: http://stackoverflow.com/questions/32815493/custom-painting-of-a-swing-component-with-multiple-calls-to-repaint – Berger

+1

zeichnen Sie Kreis nur wenn Maus ist innerhalb der erforderlichen Quadrate. –

+0

@Berger Vielen Dank für den Link. Ich verstehe, dass multiple repaint() -Methode "irgendwie verarbeitet" wird und nur einmal neu streichen wird, aber es erklärt nicht, warum es unerwünschten Bereich neu übermalt, es sei denn, der "Prozess" würde diesen Bereich einschließen. – minolee

Antwort

1

Ich denke Schnelle Schnecke 's Lösung ist die richtige Antwort im Allgemeinen. Wenn Sie eine dynamische Situation mit dynamischer Größe des Boards oder so haben, können Sie zeichnen, nur wenn die Maus innerhalb der erforderlichen Quadrate wie empfohlen ist.

Mehrere Anrufe repaint machen nur einen größeren Bereich von repaint, um alle Bereiche einzubeziehen, die Sie in den mehreren Anrufen von repaint angegeben haben.

Aber wenn Sie diese kleine Karte mit 9-Zellen haben, ich glaube, es ist eine kurzfristige Lösung für Ihre Situation, um nicht zu einzelnen Aufrufen zum repaint zu machen:

public class MiniGraphicTest extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public int x, y; 
    boolean flag; 

    public MiniGraphicTest() { 
     super(); 
     x = -1; 
     y = -1; 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent m) { 
       x = m.getX() - 25; 
       y = m.getY() - 25; 
       if(flag) { 
        repaint(100, 100, 100, 100); 
       } else { 
        repaint(200, 200, 100, 100); 
       } 
       flag = !flag; 
      } 
     }); 
    } 
    // Other codes of yours 
} 

Good Luck.

0

repaint() nur die Komponente in EDT werden neu gestrichen markiert. Nachfolgende Anrufe ändern nichts.

Rufen Sie repaint mit Koordinaten (Rechteck) markieren Sie die Komponente, die nur innerhalb der Rect neu lackiert werden soll. Nachfolgende Aufrufe können nur das Rect ändern (erweitern).

Wenn Sie zu einem Bereich clip zeichnen möchten, müssen Sie dies in Ihrer paintComponent Methode angeben.

Verwandte Themen