【问题标题】:For loop causing a black screen in JFrame(Eclipse)For循环导致JFrame(Eclipse)中的黑屏
【发布时间】:2015-10-29 23:39:53
【问题描述】:

这是我的代码,我正在尝试为学校做一个项目,但由于某些奇怪的原因,每当我添加一个循环时它就无法正常工作,它会导致第二个 JFrame 完全变黑.. 一旦点击它应该在按钮 A B 和 C 之间切换

【问题讨论】:

  • 您实际上是在阻塞事件调度线程。有关详细信息,请参阅Concurrency in Swing。考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将导致更少的混乱和更好的响应
  • 是的,但是我没有您的代码的可运行示例,所以我不知道您可以从哪里开始
  • 我会首先减少您拥有的帧数,也许首先使用CardLayout。我会使用pack 来设置窗口的初始大小,只有在你准备好 UI 之后,我才会在框架 (z) 上调用setVisible,因为你的代码对我来说很好,但我可能不会以与您相同的方式运行它。你的while (x > 0) 不会运行,因为x 被初始化为0
  • 我添加了跑步者并修复了 (x>=0) 但现在它在 JFrame 中给了我一个黑屏
  • 也打包了而不是使用分辨率

标签: java swing loops concurrency event-dispatch-thread


【解决方案1】:

对您的意图进行一些疯狂的猜测,您只是在以线性方式思考很多事情,这很像您对基于控制台的应用程序的想法,但 GUI 是一个事件驱动的环境。事情发生了,你被告知,你做出反应。

基本上,在准备好基础 IU 之后,您应该最后致电 setVisible

你需要摆脱你的while-loop,它不会做你想做的事。相反,您需要使用单个ActionListener,它可以根据x 的值确定单击任何按钮时应该发生的情况,例如:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class Game implements Runnable {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Game());
    }

    private int counter;
    private int x;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        counter = 0;
        JFrame y = new JFrame("Game");
        y.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton start = new JButton("Start game");
        y.add(start, BorderLayout.SOUTH);
        y.pack();
        JLabel a = new JLabel();
        a.setText("<HTML><body><H1>Instructions</H1><p>Click the 'start' button to start the game" + "<br>Click as many of the red buttons as you can before time runs out!<p></body></HTML>");
        y.add(a);
        y.pack();
        y.setVisible(true);
        start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Timer time = new Timer(10000, new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("You got " + counter + " points");
                        System.exit(0);
                    }
                });
                time.start();
                JFrame z = new JFrame("Sequence game");
                FlowLayout fl = new FlowLayout(0, 50, 40);
                z.getContentPane().setLayout(fl);
                JButton a = new JButton("A");
                Font f = a.getFont();
                Font myFont = f.deriveFont(Font.BOLD, f.getSize() * 4);
                a.setSize(200, 100);
                a.setVisible(true);
                JButton b = new JButton("B");
                b.setVisible(true);
                b.setSize(200, 100);
                JButton c = new JButton("C");
                c.setVisible(true);
                c.setSize(200, 100);
                z.setSize(1280, 1024);
                z.getContentPane().add(a);
                z.getContentPane().add(b);
                z.getContentPane().add(c);
                Random r = new Random();

                x = r.nextInt(3);
                ActionListener listener = new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (x == 0 && e.getSource().equals(a)) {
                            counter++;
                            x = r.nextInt(3);
                            a.setFont(f);
                        } else if (x == 1 && e.getSource().equals(b)) {
                            counter++;
                            x = r.nextInt(3);
                            b.setFont(f);
                        } else if (x == 2 && e.getSource().equals(c)) {
                            counter++;
                            x = r.nextInt(3);
                            c.setFont(f);
                        }

                        switch (x) {
                            case 0:
                                a.setFont(myFont);
                                break;
                            case 1:
                                b.setFont(myFont);
                                break;
                            case 2:
                                b.setFont(myFont);
                                break;
                        }
                        z.revalidate();
                        z.repaint();
                    }
                };

                System.out.println(x);
                switch (x) {
                    case 0:
                        a.setFont(myFont);
                        break;
                    case 1:
                        b.setFont(myFont);
                        break;
                    case 2:
                        b.setFont(myFont);
                        break;
                }
                z.revalidate();
                z.repaint();

                a.addActionListener(listener);
                b.addActionListener(listener);
                c.addActionListener(listener);

                z.pack();
                z.setVisible(true);
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多