2017-03-26 34 views
0

因此,我的目標是使用GUI製作一個基本的Etch-A-Sketch。除了能夠使用鼠標進行繪製外,我還需要添加一個按鈕,以改變任何四種顏色之間的線條顏色。正如我剛剛學習這是第一次,我得到儘可能改變線的顏色之前,我遇到了一個問題:Java:不知道如何修改一個單獨的類中的圖形對象

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

public class Etch_A_Sketch implements MouseListener, MouseMotionListener 
{ 
    JFrame window; 
    Container content; 
    int mouseX,mouseY,oldX,oldY; 
    JButton colorButton; 
    ActionListener bPress = new MyListener(); 

    public Etch_A_Sketch() 
    { 
     JFrame window = new JFrame("Classic Etch a Sketch"); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     content = window.getContentPane(); 
     window.setSize(640,480); 
     content.setLayout(new FlowLayout()); 

     content.addMouseListener(this); 
     content.addMouseMotionListener(this);   
     colorButton = new JButton("Click to switch color!"); 
     colorButton.setSize(175,50); 
     colorButton.setVisible(true); 
     colorButton.addActionListener(bPress); 
     content.add(colorButton); 

     window.setVisible(true); 
    } 


    public void mouseClicked(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 

    } 

    public void mousePressed(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 
     //repaint(); 
    } 

    public void mouseReleased(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 
     //repaint(); 
    } 

    public void mouseExited(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 
     //repaint(); 
    } 

    public void mouseEntered(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 
     //repaint(); 
    } 

    public void mouseDragged(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 

     if (oldX ==0) 
     { 
      oldX=mouseX; 
      oldY=mouseY; 
      return; 
     } 


     Graphics g = content.getGraphics(); // use g to draw onto the pane 
     g.drawLine(oldX,oldY, mouseX, mouseY); 
     oldX = mouseX; 
     oldY = mouseY; 
     // repaint(); 
    } 

    public void mouseMoved(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 
     //repaint(); 
    } 

    class MyListener implements ActionListener 
    { 
     final Color[] colors = {Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE}; 
     int index = 0; 

     public void actionPerformed(ActionEvent e) 
     { 
      g.setColor(colors[index]); 
      index = (index + 1) % colors.length; 
     } 
    } 


    public static void main(String[] args) 
    { 
     new Etch_A_Sketch(); 
    } 
} 

我的問題是這樣的 - 我實現了所提到的「G」在MyListener類中超出範圍,因爲它是mouseDragged方法的一部分。當我的JButton被按下時,我將如何去改變它?我已經嘗試將g的聲明移到方法之外,但它不起作用。任何幫助,將不勝感激!另外,可能值得注意的是我有一個基本文件來啓動這個項目,並且「// repaint();」線已經分開了。我不確切地知道他們的意思,但是......這與我的問題有關嗎?

回答

0

嘗試在文件的頂部放置靜態全局變量;

static Graphics g = null; 

然後在public void mouseDragged(MouseEvent me)

Etch_A_Sketch.g = content.getGraphics(); // use g to draw onto the pane 

然後引用它在class MyListener

但有趣的是安全的,我會建議使用接口。聲明一個主類,讓這個類實現它,則觸發事件時,你想要的content.getGraphics();

+0

介紹靜態變量,尤其是包含*圖形上下文*的靜態變量可能是一個非常糟糕的主意。例如,如果你這樣做,你認爲會發生什麼:'new Etch_A_Sketch();新的Etch_A_Sketch();'?第一個蝕刻草圖上的圖紙繪製在第二個窗口上! – cubrr

0

值你可以做的是傳遞一個參考顯卡通過一個構造對象:

class MyListener implements ActionListener 
{ 
    private final Graphics graphics; 
    private final Color[] colors = {Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE}; 
    private int index = 0; 

    public MyListener(Graphics graphics) 
    { 
     this.graphics = graphics; 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     this.graphics.setColor(colors[index]); 
     index = (index + 1) % colors.length; 
    } 
} 

現在,在創建時的ActionListener,而不是這樣做......

ActionListener bPress = new MyListener(); 

public Etch_A_Sketch() 
{ 
    JFrame window = new JFrame("Classic Etch a Sketch"); 
    // ... 
    // ... 
    colorButton.addActionListener(bPress); 
    content.add(colorButton); 

    window.setVisible(true); 
} 

你可以這樣做:

public Etch_A_Sketch() 
{ 
    JFrame window = new JFrame("Classic Etch a Sketch"); 
    // ... 
    // ... 
    Graphics graphics = content.getGraphics(); 
    colorButton.addActionListener(new MyListener(graphics)); 
    content.add(colorButton); 

    window.setVisible(true); 
} 
-1

請勿使用getGraphics()進行繪畫。

繪畫是通過用自定義繪畫代碼覆蓋面板的paintComponent(...)方法完成的。

查看Custom Painting Approaches瞭解幾種不同的自定義繪畫方法的實例。這些示例向您展示瞭如何繪製不同顏色的矩形。

0

良好的面向對象設計是關於什麼保持不變和你期望你會擴展之間的區分。你是etcha素描的鉛筆會擴大很多(將添加不同的顏色,不同的厚度,生產盒子,而不是一個塗鴉,也許橡皮擦)。你應該創建一個鉛筆類。

public class Pencil { 
    private Graphics backGroundGraphics; 
    final Color[] colors = {Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE}; 
    private int colorIndex; 


public Pencil(BufferedImage backGround) { 
    backGroundGraphics = backGround.getGraphics(); 
    backGroundGraphics.setColor(Color.BLACK); 
} 

    public void changeColor() { 
     colorIndex++; 
     backGroundGraphics.setColor(colors[colorIndex % 4]); 
    } 

    public void drawLine(int oldX, int oldY, int mouseX, int mouseY) { 
     backGroundGraphics.drawLine(oldX,oldY, mouseX, mouseY); 
    } 
} 

,然後在GUI類中添加這一切:

class Etch_A_Sketch implements MouseListener, MouseMotionListener { 

    ... 
    private Pencil pencil; 
    BufferedImage bf; 

    ... 
    ... 

     public Etch_A_Sketch() 
     { 
     bf = new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB); 
     pencil = new Pencil(bf); 
      .... 
      .... 
} 
          .... 

public void mouseDragged(MouseEvent me) 
    { 
     mouseX = me.getX(); 
     mouseY = me.getY(); 

     if (oldX ==0) 
     { 
      oldX=mouseX; 
      oldY=mouseY; 
      return; 
     } 

     pencil.drawLine(oldX, oldY, mouseX, mouseY); 
     Graphics g2 = content.getGraphics(); 

     g2.drawImage(bf, 0, 0, content); 

     oldX = mouseX; 
     oldY = mouseY; 

    } 


       .... 

class MyListener implements ActionListener 
{ 
    final Color[] colors = {Color.RED, Color.BLUE, Color.GREEN, Color.ORANGE}; 
    int index = 0; 

    public void actionPerformed(ActionEvent e) 
    { 
     pencil.changeColor(); 
    } 
} 

現在,你現在畫上一個緩衝的圖像。然後你將緩衝的圖像繪製到contentPane上。這消除了我添加新鉛筆課程時出現的閃爍行爲。這種方法被稱爲「緩衝」。

一旦你掌握了所有這些,你甚至可以練習一種名爲策略模式的設計模式。這將允許你改變你的鉛筆行爲(而不是畫線,也許畫圓圈或其他東西)。這個想法是g.drawLine代碼不會在你的鉛筆課上被硬編碼。

相關問題