2013-02-26 53 views
0

基本上我正在製作一個用鼠標繪製的繪圖板; theres一組顏色按鈕來選擇哪些是由一個setColor(int r,g,b)設置的Color參數在自定義類ColoredButton中創建的。嘗試從不同類傳遞Color參數時發生NullPointerException

因此,在ColourToolbar類中,當您單擊其中一個ColoredButton時,它將全局變量selectedCOlor設置爲該按鈕中設置的顏色(如上所述),然後DrawBoard類使用getColor()獲取顏色ColourToolbar類中的'selectedCOlor'變量。

  • 我遇到的問題是,我進去DrawBoard一個NullPointerException異常,所以顏色的說法從來沒有得到,我有嘗試過類似的方法如圖所示的代碼的權利,但所有節目NullPointerException異常。

這裏是班(我拿出這並不需要此代碼):

public class ColoredButton extends JButton { 

    public Color color; 


    public ColoredButton(ImageIcon img){ 

     super(img); 
    } 

    public void setColor(int r, int g, int b){ 

     this.color = new Color(r,g,b); 
    } 

    public Color getColor(){ 

     return this.color; 
    } 

} 

下一頁類:

public class ColourToolbar extends JPanel implements ActionListener{ 

public Color selectedColor; 
public boolean colorSelected = false; 

public ColoredButton pink,black,blue,green,orange,yellow,darkp,red,white; 

public ColourToolbar(){ 

    setBackground(Color.DARK_GRAY); 

    setLayout(new GridBagLayout()); 

    Dimension size = getPreferredSize(); 
    size.setSize(1024,80); //w, h 
    setPreferredSize(size); 

    // NOTE: There are 8 more blocks of codes like the one below, left for example. 

    ImageIcon blackicon = new ImageIcon(getClass().getResource("Icons/Colours/Black.png")); 
     black = new ColoredButton(new ImageIcon(blackicon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH))); 
     gbc.gridx = 7; 
     gbc.gridy = 0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.weightx = 0.5;  
     black.setColor(255, 255, 255); 
     black.setOpaque(false); 
     black.setContentAreaFilled(false); 
     black.setBorderPainted(false); 
     black.setActionCommand("orange"); 
     black.addActionListener(this); 
     gbc.insets = new Insets(0,0,0,0); //top, left, bottom, right 
     add(black, gbc); 


} 

@Override 
public void actionPerformed(ActionEvent e){ 

    // all colors: black, blue, green, orange, *pink, yellow, darkpink, *red, white 

    if("black".equalsIgnoreCase(e.getActionCommand())){ 

     this.selectedColor = black.getColor(); 
     System.out.println("black= " + selectedColor.toString()); 
     this.colorSelected = true; 
    }  
} 

public Color getCurrColor(){ 

    return this.selectedColor; 
} 


} 

末級在那裏我得到NullPointerException異常:

public class DrawBoard extends JPanel implements MouseListener, MouseMotionListener{ 

public JLabel status; 
private JLabel imgLabel; // this is where the drawing happens 
private List<Point> points = new ArrayList<Point>(); 
private List<BufferedImage> lines = new ArrayList<BufferedImage>(); 

private static final int BI_WIDTH = 1024; 
private static final int BI_HEIGHT = 800; 

private BufferedImage bImage = new BufferedImage(BI_WIDTH, BI_HEIGHT, 
     BufferedImage.TYPE_INT_ARGB); 

public Color currentColor; 

public DrawBoard(){ 

    Graphics2D g2d = bImage.createGraphics(); 
    g2d.dispose(); 

    Dimension size = getPreferredSize(); 
    size.setSize(1024,800); //w, h 
    setPreferredSize(size); 
    status = new JLabel("default"); 
    add(status, BorderLayout.SOUTH); 
    addMouseListener(this); 
    addMouseMotionListener(this); 


    imgLabel = new JLabel(new ImageIcon(bImage)) { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     paintInLabel(g); 
    } 
    }; 
    imgLabel.setOpaque(false); 
    setOpaque(false); 
     add(imgLabel, BorderLayout.CENTER); 

} 

private void paintInLabel(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(getColor()); // this colour is when mouse is pressed 
    g2d.setStroke(new BasicStroke(5)); 
    if (points.size() < 2) { 
    return; 
    } 
    for (int i = 1; i < points.size(); i++) { 
    int x1 = points.get(i - 1).x; 
    int y1 = points.get(i - 1).y; 
    int x2 = points.get(i).x; 
    int y2 = points.get(i).y; 
    g2d.drawLine(x1, y1, x2, y2); 
    } 
} 

// Where the drawing happens 
@Override 
public void mousePressed(MouseEvent e) { 
    status.setText("you pressed down the mouse"); 
    this.pstart = e.getPoint(); 
    points.add(e.getPoint()); 

} 

@Override 
public void mouseDragged(MouseEvent e) { 
    status.setText("you draged the mouse"); 
    points.add(e.getPoint()); 
    imgLabel.repaint(); 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    status.setText("you release the mouse click"); 
    Graphics2D g2d = bImage.createGraphics(); 
    g2d.setColor(getColor()); // this is the final colour - 
    g2d.setStroke(new BasicStroke(5)); 

    if (points.size() >= 2) { 
     for (int i = 1; i < points.size(); i++) { 
      int x1 = points.get(i - 1).x; 
      int y1 = points.get(i - 1).y; 
      int x2 = points.get(i).x; 
      int y2 = points.get(i).y; 
      g2d.drawLine(x1, y1, x2, y2); 
     } 
    } 
    g2d.dispose(); 

    points.clear(); 
    imgLabel.repaint(); 

} 
// End of where the drawing happens 


// BELOW IN THIS METHOD IS WHERE it gets the NullPointerException 
private Color getColor() { 
    ColourToolbar ct = new ColourToolbar(); 
    System.out.println(ct.getCurrColor().toString()); 

    return ct.getCurrColor(); 
} 

private void setColor(Color col){ 

    this.currentColor = col; 
} 

} 

錯誤stacktrace在這裏:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at gui.DrawBoard.getColor(DrawBoard.java:162) 
    at gui.DrawBoard.paintInLabel(DrawBoard.java:78) 
    at gui.DrawBoard.access$000(DrawBoard.java:32) 
    at gui.DrawBoard$1.paintComponent(DrawBoard.java:67) 
    at javax.swing.JComponent.paint(JComponent.java:1054) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paint(JComponent.java:1063) 
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) 
    at javax.swing.JComponent.paintChildren(JComponent.java:887) 
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228) 
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) 
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206) 
    at javax.swing.JComponent.paint(JComponent.java:1040) 
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39) 
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78) 
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115) 
    at java.awt.Container.paint(Container.java:1967) 
    at java.awt.Window.paint(Window.java:3877) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:781) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677) 
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:682) 
    at java.awt.EventQueue$3.run(EventQueue.java:680) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 
+6

過多的代碼和沒有堆棧跟蹤張貼?哪條線吹? – Dan 2013-02-26 19:08:14

+0

您可以創建一個最簡單的例子嗎?我想MouseListener是沒有必要的。所以刪除它,嘗試如果你仍然得到你的錯誤,併發佈一個簡短的例子。你的源代碼中有更多的行似乎是不相關的。 – 2013-02-26 19:09:53

+0

添加堆棧跟蹤,將清理更多的代碼 – nullwriter 2013-02-26 19:10:27

回答

5

好吧,這就是問題所在:

ColourToolbar ct = new ColourToolbar(); 
System.out.println(ct.getCurrColor().toString()); 

getCurrColor()回報selectedColorColourToolbar內......但你沒有一個selectedColor ...的構造函數不設置任何事情。所以價值是null,當你打電話toString()你會得到例外。

在你的描述,你說:

它設置一個全局變量selectedCOlor

selectedColor不是一個 「全局」 變量 - 這是一個實例變量;每個ColourToolbar實例都有一個單獨的selectedColor變量。

你爲什麼要這麼做ColourToolbar雖然?難道你不想從現有的工具欄中獲取選定的顏色嗎?或者如果你真的希望它是全球性的(ick),它應該是一個靜態變量,由靜態方法獲取,根本沒有你創建一個新的實例。

+1

println進行調試,因爲我想打印如果顏色到達那裏,因爲它不會改變圖形的顏色(顯然)。我做了新的ColourToolbar,因爲我無法擴展這個類來獲取'selectedColor'變量。我可以通過什麼方式來控制這個變量?來自DrawBoard類的 – nullwriter 2013-02-26 19:15:27

+0

,即。 – nullwriter 2013-02-26 19:15:48

+0

這使我困惑了一下,我如何從該實例中獲取selectedColor,或者如何將實例對象從ColourToolbar發送到DrawBoard? – nullwriter 2013-02-26 19:27:15

相關問題