JFrame显示灰色,空白

我有一个问题,我的框架显示为灰色,但几秒后,它显示图像,因为我的for循环正在完成。 我需要这样做才能在打开图像时正确显示图像以显示循环。 这是我的整个代码,抱歉长度:

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); } } 

提前致谢。

第一个问题是你在向它添加任何东西之前设置框架是可见的…

相反,尝试最后调用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扩展,因为您没有向类添加任何新function,需要考虑初始线程并确保在Event Dispatching Thread的上下文中启动主UI。

其余问题与您之前的问题有关

更新了工作示例

蛇的眼睛

因为我很懒,我使用了Graphics 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 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(); } } }