首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在单独的线程中定义的绘制函数而不是绘制(Java)

在单独的线程中定义的绘制函数而不是绘制(Java)
EN

Stack Overflow用户
提问于 2018-10-07 01:15:58
回答 1查看 221关注 0票数 0

我有三个文件,这里是主要的一个,标题为Display.java:

代码语言:javascript
复制
import java.awt.*;
import javax.swing.*;

public class Display{
    static JFrame main = new JFrame("hello");
    static Container c = main.getContentPane();
    static StartScreen start = new StartScreen();
    static screenTracker track = new screenTracker();

    public static void main(String[] args) {
        main.setSize(new Dimension(1920,1080));
        main.setVisible(true);
        if(track.screen==1) {
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.add(start,  BorderLayout.CENTER);
    }
    }
}

我的第二个文件名为: StartScreen.java。它包含了我的paint函数:

代码语言:javascript
复制
import java.applet.Applet;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class StartScreen extends Applet{
    private static final long serialVersionUID = 1L; 
    int x = 0;
    static Container c = Display.c;
    static Color gray = new Color(128,128,128);
    public void paint(Graphics g) {
        Thread t = new Thread() {
            @Override
            public void run() {
        while(true) {
        c.setBackground(gray);
        g.clearRect( 0 , 0 , getWidth() , getHeight() );
        BufferedImage img1 = null;
        BufferedImage img2 = null;
        BufferedImage img3 = null;
        try {
            img1 = ImageIO.read(new File("images/img1.png"));
            img2 = ImageIO.read(new File("images/img2.png"));
            img3 = ImageIO.read(new File("images/img3.png"));
        }
        catch(IOException e) {
            g.drawString("bad", 200, 200);
        }
        String title1 = "hello: ";
        String title2 = "Gamee ";
        String title3 = "people";
        Color pink = new Color(244,66,182);
        Color black = new Color(0,0,0);
        g.setColor(black);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 50));
        g.drawString(title1, x+600, 200);
        g.setColor(pink);
        g.setFont(new Font("TimesRoman", Font.ITALIC, 50));
        g.drawString(title2, 860, 200);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 50));
        g.setColor(black);
        g.drawString(title3, 960, 200);
        g.drawImage(img1, 200, 250, null);
        g.drawImage(img2, 700, 150, 1000, 750, null);
        g.drawImage(img3, 500, 250, null);
        x++;
        try {
            sleep(10);  // milliseconds
         } catch (InterruptedException ex) {}
        }
            }
        };
        t.start();
    }
}

我的第三个文件很短:

代码语言:javascript
复制
public class screenTracker {
int screen = 1;
}

现在,我只想在我的JFrame上显示StartScreen.java中的paint函数。我想让hello在屏幕上移动。我做了线程t,这样屏幕就可以关闭了。如果我去掉线程t,或者在Display.java中创建它(在If语句中,围绕着我设置默认close操作并将startscreen添加到容器c的位置),程序会绘制我想要的内容,但是Jframe不会关闭。我看了很多其他的网站和问题,但我一直没能解决这个问题。我对java中的多线程和图形是个新手,

EN

回答 1

Stack Overflow用户

发布于 2018-10-07 01:26:34

如果我们谈论java中的图形,我们只有一个线程负责它,那就是EDT (1)。换句话说,无论你想对视图做什么,都将由EDT处理,而且必须由EDT处理,是的,你的视图也会处理所有的setbackroungs、frame……

但请注意,它只是一个线程,当这个线程忙于做一些计算不能反应用户事件,所以你的视图将冻结。你可以在另一个线程中做的就是准备数据(在你的例子中读取文件图像)

要在EDT中工作,可以使用SwingInvoker.invokelater(),或者使用swingutilities.isEventDispatchThread()检查您是否已经在EDT中。

代码语言:javascript
复制
[1] https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52681496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档