2016-03-15 33 views
1

這是繪製矩形的類。它應該使用靜態ints x,y作爲要繪製的矩形位置的組件,它們是鼠標單擊時的x和y分量。 x,y來自event.getX()和event.getY()中的Gui3類。該程序及其所有方法都可以正常工作,唯一的問題是在繪製形狀時出現問題。爲什麼矩形不能繪製點擊的位置?

類以繪製形狀

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

public class DrawShapes extends JPanel { 
    public static int x,y; 
    public void paintComponent(Graphics g){ 
     g.setColor(Color.BLUE); 
     g.fillRect(x,y,80,80); 
    } 
    public class GuiDemo extends Gui3{ 
     public GuiDemo(){ 
      x=x1; 
      y=y1; 
     } 
     } 

} 

主要的類,它的一切

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

public class Gui3 extends JFrame { 
    private JPanel mousepanel; 
    private JLabel statusbar; 
    public static int x1=0, y1=0; 
    public Gui3(){ 
     super("The title"); 

     mousepanel = new JPanel(); 
     mousepanel.setBackground(Color.WHITE); 
     add(mousepanel, BorderLayout.CENTER); 

     statusbar = new JLabel("Default"); 
     add(statusbar, BorderLayout.SOUTH); 

     HandlerClass handler = new HandlerClass(); 
     mousepanel.addMouseListener(handler); 
     mousepanel.addMouseMotionListener(handler); 
    } 
    private class HandlerClass implements MouseListener, MouseMotionListener 
     { 
     @Override 
     public void mouseClicked(MouseEvent event) { 
      statusbar.setText(String.format("Clicked at %d, %d", event.getX(),event.getY())); 

這是x和y分量從

x1=event.getX(); 
y1=event.getY(); 

組件獲得接受傳遞給DrawShapes類。 矩形只能在角落畫畫。它應該是借鑑的地方我點擊

enter image description here

   DrawShapes shapes = new DrawShapes(); 
       add(shapes); 
      } 
      @Override 
      public void mousePressed(MouseEvent event){ 
       statusbar.setText("You pressed down the mouse"); 
      } 

      @Override 
      public void mouseReleased(MouseEvent event){ 
       statusbar.setText("You released the button"); 
      } 
      @Override 
      public void mouseEntered(MouseEvent event){ 
       statusbar.setText("You entered the area"); 
       mousepanel.setBackground(Color.RED); 
      } 
      @Override 
      public void mouseExited(MouseEvent event){ 
       statusbar.setText("The mouse has left the window"); 
       mousepanel.setBackground(Color.WHITE); 
      } 
      //These are mouse motion events 
      @Override 
      public void mouseDragged(MouseEvent event){ 
       statusbar.setText("You are dragging the mouse"); 
      } 
      @Override 
      public void mouseMoved(MouseEvent event){ 
       statusbar.setText("You are moving the mouse"); 
      } 
     } 
    } 
+0

請使您的縮進可讀並修復您的格式。 – djechlin

+1

我覺得你錯過了'repaint'的某處 –

+1

*「它應該使用靜態整數x,y」* - 好吧,有一個問題開始 – MadProgrammer

回答

4

你看到左上角的矩形是因爲xDrawShapesy分配只有一次的原因,當GuiDemo構造;在那個時間點,x1y1都被初始化爲0。雖然x1y1在點擊後重新分配,但此更改絕不會傳播回DrawShapes類。

我有幾個建議:

  • 完全刪除靜態變量。只是將對象之間的事情傳遞給對象更容易。 DrawShapes應該有xy,就把我會令他們的私人(還有誰需要它們?)和非靜態的(如果你需要一個以上的DrawShapes
  • 添加方法DrawShapes,這樣你有辦法來傳達這個位置到目標,將繪製矩形:

    public void setPosition(int newX, int newY) { 
        this.x = newX; 
        this.y = newY; 
        repaint(); 
    } 
    

    重繪這裏重要(的Java Swing管理大量的圖紙對你的工作,但你需要讓它知道什麼時候如果您正在進行自定義繪畫,則需要重繪。)

  • 使用當點擊發生時

    shapes.setPosition(event.getX(), event.getY()); 
    

警告:上面的代碼是未經測試,但我相信這將設置你沿着正確的道路。

+0

完美工作!謝謝:)你能否解釋一下如何以及何時使用重繪方法? –