2016-02-05 31 views
0

刪除按鈕,我有一個Java Swing項目時,看起來像這樣:在JLabel的

import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JPanel; 

import javax.swing.ImageIcon; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import java.awt.BorderLayout; 
import java.awt.Color; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 


public class DiceGameReplaceDice extends JFrame 
{ 
    private JFrame gameFrame; 
    private JPanel mainPanel; 
    private JPanel centerPanel = new JPanel(); 
    private JButton diceArray[]; 
    private DiceListener diceListener = new DiceListener(); 
    private ButtonListener buttonListener = new ButtonListener(); 
    private Random rand = new Random(); 
    private int NUM_DICE = 2; 


    private String diceImages[] = {"./src/1.png", "./src/2.png", "./src/3.png", 
      "./src/4.png", "./src/5.png", "./src/6.png"}; 

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

    public DiceGameReplaceDice()  
    { 
     // Initialize the frame that holds the game 
     gameFrame = new JFrame(); 
     gameFrame.setSize(800, 600); 
     gameFrame.setLocation(300, 100); 
     gameFrame.setTitle("Dice Game"); 
     gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Add Panel 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout()); 

     // Instantiate a ButtonListener 
     buttonListener = new ButtonListener(); 


     // Add 1 Button and 1 Label to a newly created panel 
     // Add new panel to West 
     JButton buttonW1 = new JButton("Add Die"); 
     buttonW1.setName("W1"); 
     buttonW1.addActionListener(buttonListener); 
     JPanel panelWest = new JPanel(); 
     panelWest.setLayout(new BoxLayout(panelWest,BoxLayout.Y_AXIS)); 
     panelWest.setBackground(new Color(0, 0, 122)); // set to blue 
     panelWest.add(Box.createVerticalGlue()); 
     panelWest.add(buttonW1); 
     panelWest.add(Box.createVerticalGlue()); 

     mainPanel.add(panelWest, BorderLayout.WEST); 


     // Create and display center panel with dice 
     displayCenterPanel(); 

     // Add mainPanel to frame and display the frame 
     gameFrame.add(mainPanel); 
     gameFrame.setVisible(true); 
    } 

    private void displayCenterPanel() 
    { 
     centerPanel = new JPanel(); 
     centerPanel.setLayout(new BoxLayout(centerPanel,BoxLayout.X_AXIS)); 
     centerPanel.setBackground(new Color(0, 122, 0)); // set to green 
     centerPanel.add(Box.createHorizontalGlue()); 

     diceArray = new JButton[NUM_DICE]; 

     // Add 2 Buttons to center panel with images of 2 random dice 
     for (int i=0; i<NUM_DICE; i++) 
     { 
      // Create dice button 
      int dieNum = rand.nextInt(6)+1; 
      diceArray[i] = new JButton(new ImageIcon(diceImages[dieNum-1])); 
      diceArray[i].setName("Dice" + i); 
      diceArray[i].addActionListener(diceListener); 

      // Add to center panel 
      centerPanel.add(diceArray[i]); 
      centerPanel.add(Box.createHorizontalGlue()); 
     } 

     mainPanel.add(centerPanel, BorderLayout.CENTER); 

     // Add mainPanel to frame and display the frame 
     gameFrame.add(mainPanel); 
     gameFrame.setVisible(true); 
    } 

    // Implement an (inner) class that implements ActionListener 
    class DiceListener implements ActionListener 
    { 

     public void actionPerformed(ActionEvent e) 
     { 
      NUM_DICE -= 1; 
      displayCenterPanel(); 
     } 
    } 

    // Implement an (inner) class that implements ActionListener 
    class ButtonListener implements ActionListener 
    { 

     public void actionPerformed(ActionEvent e) 
     { 
      String button = ((JButton)e.getSource()).getName(); 
      System.out.println("Button Pressed: " + button); 
      if (button.equals("W1")) 
       NUM_DICE ++; 
      System.out.println(NUM_DICE); 
      displayCenterPanel(); 
     } 
    } 
} 

當點擊「添加死」按鈕,模具被添加到屏幕和格式正確無誤。但是,當按下一個骰子並減少NUM_DICE時,單擊骰子按鈕會導致奇怪的重疊和「鬼按鈕」。你如何解決這個問題?

+2

a)不要顯示「近似」代碼 - 你錯過的位可能是重要的一塊。 b)再次調用'displayCenter()'「之前,您是否清除了面板中所有現有的孩子? – John3136

+0

a)我知道,但是,正如上面提到的,我正在使用我的手機編寫此代碼,因此我目前無法訪問完整的代碼。但是,由於我犯了一個非常普遍的/愚蠢的錯誤,我想盡快把它弄清楚。 b)不。如何刪除孩子? – Theo

+2

發佈[MCVE](http://stackoverflow.com/help/mcve)。一定要將你的代碼複製粘貼到一個*新的項目中*,並確保它在發佈之前編譯並運行。 – user1803551

回答

0

快速修復方法是先刪除centerPanel,然後再添加新的。添加該行

mainPanel.remove(centerPanel); 

作爲你在displayCenterPanel裏面做的第一件事。

但是,動態操作佈局的方式留下了許多不足之處。相反,每次創建一個新的面板,只需修改現有的一個:

public class DiceGame { 

    private JPanel centerPanel = new JPanel(); 
    private Random rand = new Random(); 
    private int numDice = 2; 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(() -> new DiceGame()); 
    } 

    public DiceGame() { 

     JFrame gameFrame = new JFrame(); 
     gameFrame.setSize(800, 600); 
     gameFrame.setTitle("Dice Game"); 
     gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout()); 

     JButton buttonW1 = new JButton("Add Die"); 
     buttonW1.addActionListener(e -> { 
      numDice++; 
      updateCenterPanel(); 
     }); 
     JPanel panelWest = new JPanel(); 
     panelWest.setLayout(new BoxLayout(panelWest, BoxLayout.Y_AXIS)); 
     panelWest.setBackground(new Color(0, 0, 122)); 
     panelWest.add(Box.createVerticalGlue()); 
     panelWest.add(buttonW1); 
     panelWest.add(Box.createVerticalGlue()); 

     centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.X_AXIS)); 
     centerPanel.setBackground(new Color(0, 122, 0)); 

     mainPanel.add(panelWest, BorderLayout.WEST); 
     mainPanel.add(centerPanel); 

     gameFrame.add(mainPanel); 
     gameFrame.setVisible(true); 
    } 

    private void updateCenterPanel() { 

     centerPanel.removeAll(); 
     centerPanel.add(Box.createHorizontalGlue()); 

     JButton[] diceArray = new JButton[numDice]; 

     for (int i = 0; i < numDice; i++) { 
      diceArray[i] = new JButton(Integer.toString(rand.nextInt(6) + 1)); 
      diceArray[i].setName("Dice" + i); 
      diceArray[i].addActionListener(e -> { 
       numDice--; 
       updateCenterPanel(); 
      }); 
      centerPanel.add(diceArray[i]); 
      centerPanel.add(Box.createHorizontalGlue()); 
     } 
     centerPanel.revalidate(); 
     centerPanel.repaint(); 
    } 
} 

重新確認和重新油漆是在組件層次結構無效後必要的。

注:

  • 不要創建字段時,局部變量就行了。
  • NUM_DICE不是final,所以它應該被命名爲numDice
  • 調用gameFrame.setVisible(true);當它已經可見時什麼都不做。
  • 當你有一個工作版本,無論你在做什麼,把JFrame上的setSize(...)替換成pack,並且一定要正確計算它的孩子的大小。