Java JFrame显示为灰色,空白
我有一个问题,我的框架显示为灰色,但几秒钟后,它显示的图像作为我的for循环正在完成。我需要使它能够在打开后正确显示图像,以便显示循环。这是我的全部代码,长度很抱歉:Java JFrame显示为灰色,空白,java,swing,Java,Swing,我有一个问题,我的框架显示为灰色,但几秒钟后,它显示的图像作为我的for循环正在完成。我需要使它能够在打开后正确显示图像,以便显示循环。这是我的全部代码,长度很抱歉: import java.awt.*; import javax.swing.*; public class MainFrame extends JFrame{ public void MainFrame() { setTitle("Game"); setSize(1300, 650);
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);
}
}
import java.awt.*;
导入javax.swing.*;
公共类大型机扩展JFrame{
公共虚拟主机(){
片名(“游戏”);
设置大小(1300650);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(真);
挫折地面(颜色:白色);
骰子骰子对象=新骰子();
添加(对象);
}
}
导入java.awt.*;
导入java.util.Random;
导入javax.swing.*;
公共类骰子扩展JPanel{
公共静态整数暂停(整数n)
{
试一试{
睡眠(n);
}捕捉(中断异常e){
}
返回n;
}
公共无效骰子(){
setDoubleBuffered(真);
}
@凌驾
公共组件(图形g){
超级组件(g);
int width=getWidth();
int height=getHeight();
int num=0;
对于(int i=0;i<7;i++){
随机生成器=新随机();
int编号=发电机。nextInt(6)+1;
g、 setColor(Color.WHITE);
g、 fillRect(0,0,宽度,高度);
g、 设置颜色(颜色为黑色);
g、 drawRoundRect(550、150、200、200、50、50);
系统输出打印(“测试”);
如果(数字==1){//滚动一次
num=1;
g、 setColor(新颜色(0,0,0));
g、 圆形(640240,20,20);
暂停(100);
}如果(数字==2){//滚动二次
num=2;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆形(69019020);
暂停(100);
}如果(数字==3){//滚动三次
num=3;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆形(640240,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==4){//滚动四次
num=4;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆角(590190,20,20);
g、 圆形(690,290,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==5){//滚动五次
num=5;
g、 setColor(新颜色(0,0,0));
g、 圆形(59029020);
g、 圆角(590190,20,20);
g、 圆形(640240,20,20);
g、 圆形(690,290,20,20);
g、 圆形(69019020);
暂停(100);
}如果(数字==6){//滚动六次
num=6;
g、 setColor(新颜色(0,0,0));
g、 圆角(590190,20,20);
g、 圆角(590240,20,20);
g、 圆形(59029020);
g、 圆形(69019020);
g、 圆形(690,240,20,20);
g、 圆形(690,290,20,20);
暂停(100);
}
}
g、 setFont(新字体(“TimeRoman”,Font.PLAIN,20));
g、 抽绳(“你掷了一个”+num,590100);
暂停(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
扩展,因为您没有向类添加任何新功能,需要考虑并确保在事件调度线程的上下文中启动主UI
你的其他问题与你的工作有关
使用工作示例更新
因为我很懒,所以我使用了图形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();
}
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Ellipse2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公营掷骰机{
公共静态void main(字符串[]args){
新滚筒();
}
公众掷骰子(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(新模具());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类扩展JPanel{
私有整数=1;
公众死亡(){
计时器计时器=新计时器(500,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
number=(int)(Math.round((Math.random()*5)+1));
重新油漆();
}
});
timer.setRepeats(真);
timer.setInitialDelay(0);
timer.start();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(220、220);
}