2014-01-10 80 views
1

我有一個問題,我的框架顯示爲灰色,但幾秒鐘後顯示圖像,因爲我的for循環正在完成。我需要使它能夠在打開圖像後正確顯示圖像以顯示循環。這是我的整個代碼,對不起長度:JFrame顯示爲灰色,空白

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

public class MainFrame extends JFrame{ 
    public void MainFrame() { 
     setTitle("Game"); 
     setSize(1300, 650); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setBackground(Color.WHITE); 
     Dice diceObject = new Dice(); 
     add(diceObject); 
    } 
} 
import java.awt.*; 
import java.util.Random; 
import javax.swing.*; 


public class Dice extends JPanel { 

public static int pause(int n) 
    { 
     try { 
      Thread.sleep(n); 
      } catch(InterruptedException e) { 
     } 
     return n; 
    } 

public void Dice() { 
    setDoubleBuffered(true); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    int width = getWidth();  
    int height = getHeight(); 

    int num = 0; 
    for (int i = 0; i < 7; i++) { 
     Random generator= new Random(); 
     int number = generator.nextInt(6)+1; 
     g.setColor(Color.WHITE); 
     g.fillRect(0, 0, width, height); 
     g.setColor(Color.BLACK); 
     g.drawRoundRect(550, 150, 200, 200, 50, 50); 
     System.out.println("Test"); 
     if (number == 1) {     //Roll one 
      num = 1; 
      g.setColor(new Color (0, 0, 0)); 
      g.fillOval(640, 240, 20, 20); 
      pause(100); 
     } if (number == 2) {    //Roll two 
      num = 2; 
      g.setColor(new Color (0, 0, 0)); 
      g.fillOval(590, 290, 20, 20); 
      g.fillOval(690, 190, 20, 20); 
      pause(100); 
     } if (number == 3) {    //Roll three 
      num = 3; 
      g.setColor(new Color (0, 0, 0)); 
      g.fillOval(590, 290, 20, 20); 
      g.fillOval(640, 240, 20, 20); 
      g.fillOval(690, 190, 20, 20); 
      pause(100); 
     } if (number == 4) {    //Roll four 
      num = 4; 
      g.setColor(new Color (0, 0, 0)); 
      g.fillOval(590, 290, 20, 20); 
      g.fillOval(590, 190, 20, 20); 
      g.fillOval(690, 290, 20, 20); 
      g.fillOval(690, 190, 20, 20); 
      pause(100); 
     } if (number == 5) {    //Roll five 
      num = 5; 
      g.setColor(new Color (0, 0, 0)); 
      g.fillOval(590, 290, 20, 20); 
      g.fillOval(590, 190, 20, 20); 
      g.fillOval(640, 240, 20, 20); 
      g.fillOval(690, 290, 20, 20); 
      g.fillOval(690, 190, 20, 20); 
      pause(100); 
     } if (number == 6) {    //Roll six 
      num = 6; 
      g.setColor(new Color (0, 0, 0)); 
      g.fillOval(590, 190, 20, 20); 
      g.fillOval(590, 240, 20, 20); 
      g.fillOval(590, 290, 20, 20); 
      g.fillOval(690, 190, 20, 20); 
      g.fillOval(690, 240, 20, 20); 
      g.fillOval(690, 290, 20, 20); 
      pause(100); 
     } 
    } 
    g.setFont(new Font("TimesRoman", Font.PLAIN, 20)); 
    g.drawString("You rolled a " + num, 590, 100); 
    pause(1000); 
} 
} 

在此先感謝。

+4

[我們不是已經有這樣的談話?](https://stackoverflow.com/questions/21033199/how-do-i-stop-my-paint-method-form-repeating-twice) – MadProgrammer

+0

同意@MadProgrammer ... – ccjmne

+0

@MadProgrammer是的我知道,但我試過另一種方法,這一個似乎它會工作很多如果我能夠實現這個目標,那就更好。 – jcole30

回答

2

第一個問題是,你設置了框可見之前您添加任何東西給它...

相反的事實,嘗試調用setVisible最後

public class MainFrame extends JFrame{ 
    public void MainFrame() { 
     setTitle("Game"); 
     setSize(1300, 650); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBackground(Color.WHITE); 
     Dice diceObject = new Dice(); 
     add(diceObject); 
     setVisible(true); 
    } 
} 

你也應該避免直接延伸JFrame,因爲您並未向課程添加任何新功能,需要考慮Initial Threads,並確保您在事件派發線程的上下文中啓動主UI。

你的問題,其餘涉及到你的previous question

與工作示例更新

Snake Eyes

因爲我懶,我使用的圖形2D API繪製點。我這樣做是因爲很多的點出現在許多數字的相同位置...

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DiceRoller { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new Die()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class Die extends JPanel { 

     private int number = 1; 

     public Die() { 
      Timer timer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        number = (int) (Math.round((Math.random() * 5) + 1)); 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setInitialDelay(0); 
      timer.start(); 
     } 

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

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int width = getWidth(); 
      int height = getHeight(); 

      g2d.setColor(Color.WHITE); 
      g2d.fillRect(0, 0, width, height); 
      g2d.setColor(Color.BLACK); 
      g2d.drawRoundRect(10, 10, width - 20, height - 20, 50, 50); 

      List<Shape> dots = new ArrayList<>(6); 

      if (number == 1 || number == 3 || number == 5) { 
       int x = (width - 20)/2; 
       int y = (height - 20)/2; 
       dots.add(new Ellipse2D.Float(x, y, 20, 20)); 
      } 

      if (number == 2 || number == 3 || number == 4 || number == 5 || number == 6) { 

       int x = ((width/2) - 20)/2; 
       int y = ((height/2) - 20)/2; 
       dots.add(new Ellipse2D.Float(x, y, 20, 20)); 
       dots.add(new Ellipse2D.Float(x + (width/2), y + (height/2), 20, 20)); 

      } 

      if (number == 4 || number == 5 || number == 6) { 

       int x = (width/2) + (((width/2) - 20)/2); 
       int y = ((height/2) - 20)/2; 
       dots.add(new Ellipse2D.Float(x, y, 20, 20)); 
       dots.add(new Ellipse2D.Float(x - (width/2), y + (height/2), 20, 20)); 

      } 

      if (number == 6) { 

       int x = (((width/2) - 20)/2); 
       int y = (height - 20)/2; 
       dots.add(new Ellipse2D.Float(x, y, 20, 20)); 
       dots.add(new Ellipse2D.Float(x + (width/2), y, 20, 20)); 

      } 

      for (Shape dot : dots) { 
       g2d.fill(dot); 
      } 

      g2d.dispose(); 
     } 
    } 
}