2017-02-25 68 views
0

在外部類中,我多次調用這些方法,但setBackground()僅在我第一次調用這些方法時使用。爲什麼setBackground只能在第一次使用? (JPanel)

例如,我有對象CellPane cellpane1, cellpane2,當我第一次撥打cellpane1.drawPlayer()時,它按預期工作,當我第一次撥打cellpane2.drawWall()時,它也按預期工作。但是當我在調用cellpane1.drawPlayer()之後爲cellpane1,cellpane1.drawWall()調用drawWall()時,它不起作用。背景顏色不變。

我需要重新繪製或重新驗證,還是什麼?我是新來的這些東西。 :(我在做什麼錯

private static class CellPane extends JPanel { 

    private Color defaultBackground; 

    private CellPane() { 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       defaultBackground = getBackground(); 
       setBackground(Color.BLUE); 
      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       setBackground(defaultBackground); 
      } 
     }); 
    } 

    private void drawDefault() { 
     setBackground(defaultBackground); 
    } 

    private void drawBoxOnGoal() { 
     defaultBackground = getBackground(); 
     setBackground(Color.decode("#4a3d32")); 
    } 

    private void drawPlayerOnGoal() { 
     defaultBackground = getBackground(); 
     setBackground(Color.decode("#f9cda8")); 
    } 

    private void drawGoal() { 
     defaultBackground = getBackground(); 
     setBackground(Color.decode("#f9cda8")); 
    } 

    private void drawBox() { 
     defaultBackground = getBackground(); 
     setBackground(Color.decode("#7a5230")); 
    } 

    private void drawPlayer() { 
     defaultBackground = getBackground(); 
     setBackground(Color.YELLOW); 

    } 

    private void drawWall() { 
     defaultBackground = getBackground(); 
     setBackground(Color.RED); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(50, 50); 
    } 

} 

[編輯]

?例如:。

public class MainClass { 



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

private MainClass() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } 

      JFrame frame = new JFrame("Test"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 

      frame.add(new Map()); 

      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    }); 
} 

private static class Map extends JPanel implements ActionListener{ 

    CellPane cellPane; 
    boolean flag = true; 

    JButton button = new JButton("button"); 

    public Map() { 
     setLayout(new GridBagLayout()); 

     button.addActionListener(this); 

     add(button); 

     create(flag); 
    } 

    public void create(boolean flag) { 
     GridBagConstraints gbc = new GridBagConstraints(); 

     cellPane = new CellPane(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     if(flag) 
      cellPane.drawPlayer(); 
     else cellPane.drawWall(); 
     add(cellPane, gbc); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     flag = false; 
     create(flag); 
    } 

} 


@SuppressWarnings("serial") 
private static class CellPane extends JPanel { 

    private Color defaultBackground; 


    private void drawPlayer() { 
     defaultBackground = getBackground(); 
     setBackground(Color.YELLOW); 

    } 

    private void drawWall() { 
     defaultBackground = getBackground(); 
     setBackground(Color.RED); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(50, 50); 
    } 

}} 

我知道,這不是一個很好的例子,但它是可運行的所以我想改變單擊按鈕時cellPane的背景當flag爲true並且背景設置爲YELLOW時,構造函數調用create(flag),然後單擊按鈕,標誌變爲false並調用create(flag)where flag =假,所以它調用了cellPane.setWall()來設置背景RED,但它沒有。

我做錯了什麼?也許一件容易的事,但我是新來的這些東西。

+0

問題的可運行版本將得到高度讚賞。 –

+0

完成。這不是最好的例子,但它可以運行。先謝謝你。 :) –

+0

似乎這個解決方案已被@JBNizet爵士建議,一如既往:-) –

回答

2

單擊按鈕時,您不會更改cellPane的顏色。您正在創建另一種顏色不同的cellPane,並將其添加到與現有gridbag單元格相同的單元格單元格中。

只要改變顏色,它會很好地工作:

public Map() { 
     setLayout(new GridBagLayout()); 

     button.addActionListener(this); 

     add(button); 

     create(); 
     draw(); 
    } 

    private void draw() { 
     if (flag) { 
      cellPane.drawPlayer(); 
     } 
     else { 
      cellPane.drawWall(); 
     } 
    } 

    private void create() { 
     GridBagConstraints gbc = new GridBagConstraints(); 

     cellPane = new CellPane(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     add(cellPane, gbc); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     flag = false; 
     draw(); 
    } 
相關問題