Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止JFrame冻结?_Java_Multithreading_Jframe_Jbutton_Event Dispatch Thread - Fatal编程技术网

Java 如何防止JFrame冻结?

Java 如何防止JFrame冻结?,java,multithreading,jframe,jbutton,event-dispatch-thread,Java,Multithreading,Jframe,Jbutton,Event Dispatch Thread,所以我的问题是,有时当我按下JFrame中的JButtons时,整个帧冻结,只有通过Eclipse终止才能退出。所有的jbutton都有动作监听器,我不明白为什么它们有时会导致JFrame冻结,而有时却不会 感谢您的帮助。 这是我的密码: //objects static JFrame frame = new JFrame("Flash cards revision"); static JButton beginButton = new JButton(); static JButton con

所以我的问题是,有时当我按下JFrame中的JButtons时,整个帧冻结,只有通过Eclipse终止才能退出。所有的jbutton都有动作监听器,我不明白为什么它们有时会导致JFrame冻结,而有时却不会

感谢您的帮助。 这是我的密码:

//objects
static JFrame frame = new JFrame("Flash cards revision");
static JButton beginButton = new JButton();
static JButton continueButton = new JButton("CONTINUE");
static JButton def1Button;
static JButton def2Button;
static JButton def3Button;
static JLabel keywordLabel = new JLabel();
static JLabel title = new JLabel("BIOLOGY FLASH CARDS");
static JLabel completionCount = new JLabel("Number of keywords completed - 0/15");
static JLabel message = new JLabel();

//variables
static Color backgroundColor = new Color(255, 204, 0);
static Color labelColor = new Color(44, 103, 0);
static Color buttonColor = new Color(146, 205, 0);
static Color highlightedButtonColor = new Color(255, 105, 0);
static Font textFont = new Font("Myriad Pro", Font.PLAIN, 15);
static Border border = BorderFactory.createLineBorder(Color.BLACK);
static String[] keywordsArray = new String[15];
static String[] definitionsArray = new String[15];
static boolean[] beenUsed = new boolean[15];
static int rDefNum;
static int rButtonNum;
static int rWDefNum;
static int numTimesCorrect = 0;
static int numComplete = 0;
static int originalY = 0;
static String keyword;
static String definition;
static String wDef1;
static String wDef2;

public static void main(String[] args) throws IOException
{
    prepareFrame();
    occupyKeywordsArray();
    occupyDefinitionsArray();
    prepareMenu();

    beginButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            beginButton.removeActionListener(beginButton.getActionListeners()[0]);
            prepareTest();
            getNewKeyword();
            getWrongDefinitions();
            prepareNewDefinition();
            addActionListeners();
        }
    });
}
static void prepareFrame()
{
    frame.setVisible(true);
    frame.setResizable(false);
    frame.setLayout(null);
    frame.setSize(800,600);
    frame.setLocation(500,200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(backgroundColor);
    frame.setIconImage(Toolkit.getDefaultToolkit().getImage("biologyIcon.png"));

}
static void prepareMenu()
{
    beginButton = new JButton("BEGIN TEST");
    frame.add(title);
    frame.add(beginButton);

    title.setOpaque(true);
    title.setSize(650,100);
    title.setLocation(75,60);
    title.setHorizontalAlignment(SwingConstants.CENTER);
    title.setBackground(labelColor);
    title.setForeground(buttonColor);
    title.setFont(textFont);
    title.setFont(title.getFont().deriveFont(60.0f));
    title.setBorder(border);

    beginButton.setBackground(buttonColor);
    beginButton.setLocation(240,220);
    beginButton.setForeground(labelColor);
    beginButton.setFont(textFont);
    beginButton.setFont(beginButton.getFont().deriveFont(55.0f));
    beginButton.setSize(320,100);
    beginButton.setFocusable(false);
    beginButton.setBorder(border);
}
static void prepareTest()
{
    def1Button = new JButton();
    def2Button = new JButton();
    def3Button = new JButton();
    continueButton = new JButton("CONTINUE");

    frame.remove(title);
    frame.remove(beginButton);
    frame.add(keywordLabel);
    frame.add(message);
    frame.add(completionCount);
    frame.add(def1Button);
    frame.add(def2Button);
    frame.add(def3Button);
    frame.add(continueButton);

    frame.repaint();
    frame.revalidate();

    keywordLabel.setOpaque(true);
    keywordLabel.setHorizontalAlignment(SwingConstants.CENTER);
    keywordLabel.setBackground(labelColor);
    keywordLabel.setForeground(buttonColor);
    keywordLabel.setFont(textFont);
    keywordLabel.setFont(keywordLabel.getFont().deriveFont(60.0f));
    keywordLabel.setBorder(border);

    message.setOpaque(true);
    message.setText("Try to match the keyword to the correct definition");
    message.setSize(450,35);
    message.setLocation(175,370);
    message.setHorizontalAlignment(SwingConstants.CENTER);
    message.setBackground(labelColor);
    message.setForeground(buttonColor);
    message.setFont(textFont);
    message.setFont(keywordLabel.getFont().deriveFont(20.0f));
    message.setBorder(border);

    completionCount.setOpaque(true);
    completionCount.setSize(340,35);
    completionCount.setLocation(230,20);
    completionCount.setHorizontalAlignment(SwingConstants.CENTER);
    completionCount.setBackground(labelColor);
    completionCount.setForeground(buttonColor);
    completionCount.setFont(textFont);
    completionCount.setFont(keywordLabel.getFont().deriveFont(20.0f));
    completionCount.setBorder(border);

    continueButton.setVisible(false);
    continueButton.setSize(300,100);
    continueButton.setLocation(250,370);
    continueButton.setBackground(buttonColor);
    continueButton.setForeground(labelColor);
    continueButton.setFont(textFont);
    continueButton.setFont(def1Button.getFont().deriveFont(50.0f));
    continueButton.setFocusable(false);
    continueButton.setBorder(border);

    def1Button.setBackground(buttonColor);
    def1Button.setForeground(labelColor);
    def1Button.setFont(textFont);
    def1Button.setFont(def1Button.getFont().deriveFont(20.0f));
    def1Button.setFocusable(false);
    def1Button.setBorder(border);

    def2Button.setBackground(buttonColor);
    def2Button.setForeground(labelColor);
    def2Button.setFont(textFont);
    def2Button.setFont(def2Button.getFont().deriveFont(20.0f));
    def2Button.setFocusable(false);
    def2Button.setBorder(border);

    def3Button.setBackground(buttonColor);
    def3Button.setForeground(labelColor);
    def3Button.setFont(textFont);
    def3Button.setFont(def3Button.getFont().deriveFont(20.0f));
    def3Button.setFocusable(false);
    def3Button.setBorder(border);
}
static void prepareNewDefinition()
{
    rButtonNum = r.nextInt(3)+1;//Chooses a random number - 1, 2 or 3

    switch(rButtonNum)
    {
    case 1:
        def1Button.setText(definition);
        def2Button.setText(wDef1);
        def3Button.setText(wDef2);
        break;
    case 2:
        def1Button.setText(wDef1);
        def2Button.setText(definition);
        def3Button.setText(wDef2);
        break;
    case 3:
        def1Button.setText(wDef1);
        def2Button.setText(wDef2);
        def3Button.setText(definition);
        break;
    }

    int b1Width = def1Button.getFontMetrics(def1Button.getFont()).stringWidth(def1Button.getText()) + 45;
    int b2Width = def2Button.getFontMetrics(def2Button.getFont()).stringWidth(def2Button.getText()) + 45;
    int b3Width = def3Button.getFontMetrics(def3Button.getFont()).stringWidth(def3Button.getText()) + 45;

    keywordLabel.setText(keyword);
    keywordLabel.setSize(keyword.length()*40,100);
    keywordLabel.setLocation(400-((keyword.length()*40)/2),80);

    def1Button.setSize(b1Width,30);
    def1Button.setLocation(400 - def1Button.getWidth() / 2,210);

    def2Button.setSize(b2Width,30);
    def2Button.setLocation(400 - def2Button.getWidth() / 2,260);

    def3Button.setSize(b3Width,30);
    def3Button.setLocation(400- def3Button.getWidth() / 2,310);

    optionsListener = new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            def1Button.removeActionListener(optionsListener);
            def2Button.removeActionListener(optionsListener);
            def3Button.removeActionListener(optionsListener);
            if(e.getActionCommand().equals(definition))
            {
                correct();
            }
            else
            {
                incorrect();
            }
        }
    };
}
static void correct()
{
    numTimesCorrect++;
    if(numTimesCorrect == 1)
    {
        message.setText("Correct! Match this correctly once more to complete this keyword");
        message.setSize(550,35);
        message.setLocation(125,message.getY());
    }
    else
    {
        numComplete++;
        completionCount.setText("Number of keywords completed - "+numComplete+"/15");
        message.setText("Correct! Keyword complete!");
        message.setSize(250,35);
        message.setLocation(275,message.getY());
    }
    moveMessageDown();
    continueButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            System.out.println(continueButton.getActionListeners()[0]);
            continueButton.setVisible(false);
            continueButton.removeActionListener(continueButton.getActionListeners()[0]);
            if(numTimesCorrect == 1)
            {
                message.setSize(510,35);
                message.setLocation(145,message.getY());
                message.setText("Match this correctly once more to complete this keyword");
            }
            if(numTimesCorrect == 2)
            {
                message.setSize(450,35);
                message.setLocation(175,message.getY());
                message.setText("Try to match the keyword to the correct definition");
                getNewKeyword();
                numTimesCorrect = 0;
            }
            getWrongDefinitions();
            prepareNewDefinition();
            addActionListeners();
            moveMessageUp();
        }
    });
}
static void incorrect()
{
    numTimesCorrect = 0;
    message.setText("Incorrect! The correct definition is now highlighted");
    message.setForeground(highlightedButtonColor);

    if(def1Button.getText().equals(definition))
    {
        def1Button.setBackground(highlightedButtonColor);
    }
    if(def2Button.getText().equals(definition))
    {
        def2Button.setBackground(highlightedButtonColor);
    }
    if(def3Button.getText().equals(definition))
    {
        def3Button.setBackground(highlightedButtonColor);
    }
    message.setSize(450,35);
    message.setLocation(175,message.getY());
    moveMessageDown();

    continueButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            continueButton.setVisible(false);
            continueButton.removeActionListener(continueButton.getActionListeners()[0]);
            message.setForeground(buttonColor);
            getWrongDefinitions();
            prepareNewDefinition();
            def1Button.setBackground(buttonColor);
            def2Button.setBackground(buttonColor);
            def3Button.setBackground(buttonColor);
            message.setLocation(175,500);
            message.setText("Try to match the keyword to the correct definition");
            addActionListeners();
            moveMessageUp();
        }
    });
}
static void getNewKeyword() 
{
    boolean validDef = false;

    while(validDef == false)
    {
        rDefNum = r.nextInt(15);
        if(beenUsed[rDefNum] == false)
        {
            validDef = true;
            beenUsed[rDefNum] = true;
            keyword = keywordsArray[rDefNum];
            definition = definitionsArray[rDefNum];
        }
    }
}
static void getWrongDefinitions() 
{
    rWDefNum = r.nextInt(15);
    wDef1 = definitionsArray[rWDefNum]; 
    rWDefNum = r.nextInt(15);
    wDef2 = definitionsArray[rWDefNum]; 
    while(wDef1.equals(wDef2) || definition.equals(wDef1) || definition.equals(wDef2))
    {
        rWDefNum = r.nextInt(15);
        wDef1 = definitionsArray[rWDefNum]; 
        wDef2 = definitionsArray[rWDefNum]; 
    }
}
static void moveMessageDown()
{
    moveUpThread.stop();
    originalY = message.getY();
    moveDownThread = new Thread()
    {
        public void run()
        {
            try 
            {
                Thread.sleep(200);
            }catch (InterruptedException e){}

            for(int loop = 0; loop <= 500-originalY; loop++)
            {
                try 
                {
                    Thread.sleep(6);
                } catch (InterruptedException e){}

                message.setLocation(message.getX(),originalY+loop);
            }
            continueButton.setVisible(true);
        }
    };
    moveDownThread.start();
}
static void moveMessageUp()
{
    originalY = message.getY();
    moveUpThread = new Thread()
    {
        public void run()
        {

            try 
            {
                Thread.sleep(200);
            }catch (InterruptedException e){}

            for(int loop = 0; loop <= 630 - originalY; loop++)
            {
                try 
                {
                    Thread.sleep(6);
                } catch (InterruptedException e){}

                message.setLocation(message.getX(),500-loop);
            }
        }
    };
    moveUpThread.start();
}
static void addActionListeners()
{
    def1Button.addActionListener(optionsListener);
    def2Button.addActionListener(optionsListener);
    def3Button.addActionListener(optionsListener);
}
static void occupyKeywordsArray() throws IOException 
{
    BufferedReader keywordsReader = new BufferedReader(new FileReader("keywords.txt"));
    for(int keywordsLoop = 0; keywordsLoop <= 14; keywordsLoop++)
    {
        keywordsArray[keywordsLoop] = keywordsReader.readLine();
        keywordsReader.readLine();
    }
    keywordsReader.close();
}
static void occupyDefinitionsArray() throws IOException 
{
    BufferedReader definitionsReader = new BufferedReader(new FileReader("keywords.txt"));
    for(int definitionsLoop = 0; definitionsLoop <= 14; definitionsLoop++)
    {
        definitionsReader.readLine();
        definitionsArray[definitionsLoop] = definitionsReader.readLine();
    }
    definitionsReader.close();
}
 }
//对象
静态JFrame=新JFrame(“闪存卡修订版”);
静态JButton beginButton=新JButton();
静态JButton continueButton=新JButton(“CONTINUE”);
静态JButton def1按钮;
静态jb按钮def2按钮;
静态JButton def3按钮;
静态JLabel关键字标签=新JLabel();
静态JLabel标题=新JLabel(“生物闪存卡”);
静态JLabel completionCount=新JLabel(“完成的关键字数-0/15”);
静态JLabel消息=新JLabel();
//变数
静态颜色背景色=新颜色(255,204,0);
静态颜色标签颜色=新颜色(44,103,0);
静态颜色按钮颜色=新颜色(146,205,0);
静态颜色高亮显示按钮颜色=新颜色(255,105,0);
静态字体textFont=新字体(“Myriad Pro”,Font.PLAIN,15);
静态边框=BorderFactory.createLineBorder(Color.BLACK);
静态字符串[]关键字数组=新字符串[15];
静态字符串[]定义数组=新字符串[15];
静态布尔值[]已使用=新布尔值[15];
静态积分;
静态int-rButtonNum;
静态int rWDefNum;
静态int numtimescorect=0;
静态int numComplete=0;
静态整数初始值=0;
静态字符串关键字;
静态字符串定义;
静态字符串wDef1;
静态字符串wDef2;
公共静态void main(字符串[]args)引发IOException
{
prepareFrame();
occupyKeywordsArray();
占用定义数组();
prepareMenu();
addActionListener(新ActionListener())
{
已执行的公共无效操作(操作事件e)
{
removeActionListener(beginButton.getActionListeners()[0]);
准备测试();
getNewKeyword();
获取错误的定义();
prepareNewDefinition();
addActionListeners();
}
});
}
静态void prepareFrame()
{
frame.setVisible(true);
frame.setresizeable(false);
frame.setLayout(空);
框架。设置尺寸(800600);
帧设置位置(500200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setBackground(backgroundColor);
frame.setIconImage(Toolkit.getDefaultToolkit().getImage(“biologyIcon.png”);
}
静态空隙制备(U)
{
beginButton=新JButton(“开始测试”);
框架。添加(标题);
frame.add(开始按钮);
标题.设置不透明(真);
title.setSize(650100);
标题.设置位置(75,60);
标题.设置水平对齐(SwingConstants.中心);
标题:挫折背景(labelColor);
标题.设置前景(按钮颜色);
title.setFont(textFont);
title.setFont(title.getFont().deriveFont(60.0f));
标题.订单(边界);
开始按钮。后退(按钮颜色);
设置位置(240220);
开始按钮。设置前景(labelColor);
setFont(textFont);
setFont(beginButton.getFont().deriveFont(55.0f));
设置大小(320100);
beginButton.setFocusable(false);
beginButton.收尾顺序(边框);
}
静态孔隙准备试验()
{
def1Button=newjbutton();
def2Button=newjbutton();
def3Button=newjbutton();
continueButton=新的JButton(“CONTINUE”);
框架。移除(标题);
框架。移除(开始按钮);
frame.add(关键字标签);
frame.add(消息);
frame.add(completionCount);
frame.add(def1按钮);
frame.add(def2按钮);
frame.add(def3按钮);
frame.add(连续按钮);
frame.repaint();
frame.revalidate();
关键字label.set不透明(true);
关键词label.setHorizontalAlignment(SwingConstants.CENTER);
关键词Label.setBackground(labelColor);
关键词标签。设置前景(按钮颜色);
关键词label.setFont(textFont);
keywordLabel.setFont(keywordLabel.getFont().deriveFont(60.0f));
关键词标签。订单(边框);
message.setOpaque(true);
message.setText(“尝试将关键字与正确的定义匹配”);
消息设置大小(450,35);
消息设置位置(175370);
message.setHorizontalAlignment(SwingConstants.CENTER);
信息。挫折背景(labelColor);
message.set前台(按钮颜色);
message.setFont(textFont);
message.setFont(关键字label.getFont().deriveFont(20.0f));
消息。命令(边框);
completionCount.set不透明(true);
completionCount.setSize(340,35);
完成计数。设置位置(230,20);
completionCount.setHorizontalAlignment(SwingConstants.CENTER);
完成计数。挫折背景(labelColor);
completionCount.setForeground(按钮颜色);
completionCount.setFont(textFont);
completionCount.setFont(关键字label.getFont().deriveFont(20.0f));
completionCount.setBorder(边框);
continueButton.setVisible(false);
连续按钮设置大小(300100);
连续按钮设置位置(250370);
连续按钮。后退(按钮颜色);
设置前景(labelColor);
continueButton.setFont(textFont);
continueButton.setFont(def1Button.getFont().deriveFont(50.0f));
continueButton.setFocusable(假);
continueButton.setOrder(边框);
拆卸按钮.立根背景(按钮颜色);
设置前景(labelColor);
def1Button.setFont(textFont);
setFont(def1Button.getFont().deriveFont(20.0f));
def1Button.setFocusable(假);
def1按钮。设置顺序(边框);
拆卸按钮。后退地面(按钮颜色);
设置前景(labelColor);
def2Button.setFont(textFont);
setFont(def2Button.getFont().deriveFont(20.0f));
def2Button.setFocusable(假);
def2按钮。设置顺序(边框);
DEF3按钮。立根地面(按钮颜色);
def3按钮。设置前景(labelColor);
button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                Thread hilo = new Thread(new Runnable() {

                    @Override
                    public void run() {

                        //here your code

                    }
                });         
                hilo.start();

            }
        });
public static void main(String[] args) {
//        EventQueue.invokeLater(() -> {
        Toolkit.getDefaultToolkit().setDynamicLayout(false);
        final JFrame frame = new JFrame();
        frame.setUndecorated(true);
        final JToggleButton backgroundButton = new JToggleButton("Break me!");
        backgroundButton.setSelected(true);
        backgroundButton.addActionListener(e -> {
            if(!backgroundButton.isSelected()) {
                EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        frame.setBackground(new Color(0, 0, 0, 0));
                        backgroundButton.setText("Fix me!");
                    }
                });
            } else {
                EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        frame.setBackground(UIManager.getColor("control"));
                        backgroundButton.setText("Break me!");
                    }
                });                 
            }
        });
        final JLabel label = new JLabel("Resize Here");
        label.setBorder(BorderFactory.createLineBorder(Color.RED));
        frame.getContentPane().add(backgroundButton);
        frame.getContentPane().add(label, BorderLayout.SOUTH);
        new ComponentResizer(frame);

        frame.pack();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
//       });
}