第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在不繪制的單獨(dú)線程中定義的繪制函數(shù)(Java)

在不繪制的單獨(dú)線程中定義的繪制函數(shù)(Java)

www說 2021-11-03 10:53:52
我有三個(gè)文件,這里是主要的一個(gè),標(biāo)題為 Display.java: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);    }    }}我的第二個(gè)文件的標(biāo)題是:StartScreen.java。它包含我的繪畫功能: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);        }現(xiàn)在我只希望 StartScreen.java 中的繪制函數(shù)顯示在我的 JFrame 上。我希望你好在屏幕上移動(dòng)。我做了線程 t 以便屏幕可以關(guān)閉。如果我擺脫了線程 t,或者在 Display.java 中創(chuàng)建它(在 if 語句中,在我設(shè)置默認(rèn)關(guān)閉操作并將啟動(dòng)屏幕添加到容器 c 的位置)程序繪制我想要的東西,但 Jframe 贏了不關(guān)閉。我查看了很多其他網(wǎng)站和問題,但我無法弄清楚這一點(diǎn)。我是 Java 多線程和圖形的新手,
查看完整描述

2 回答

?
智慧大石

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊

很多問題:

  1. 不要擴(kuò)展Applet。小程序死了。對(duì)于自定義繪畫,您只需擴(kuò)展JPanel面板并將其添加到框架中即可。

  2. 您將paintComponent()在 JPanel 中覆蓋,而不是在paint() 中進(jìn)行覆蓋。

  3. 繪畫方法僅用于繪畫,您不應(yīng)該:

    1. 讀取方法中的圖像。繪畫方法被多次調(diào)用。您希望繪畫速度快,不應(yīng)該進(jìn)行 I/O。讀取類的構(gòu)造函數(shù)中的圖像

    2. 正在創(chuàng)建線程。同樣,由于無法控制多次調(diào)用繪畫方法,因此您不想繼續(xù)創(chuàng)建線程。如果您想要某種動(dòng)畫,那么您應(yīng)該使用 Swing Timer。

我建議您閱讀有關(guān)自定義繪畫的 Swing 教程中的部分。它包含的工作示例將向您展示如何更好地構(gòu)建代碼。

還有一個(gè)關(guān)于 的部分How to Use Swing Timers


查看完整回答
反對(duì) 回復(fù) 2021-11-03
?
慕運(yùn)維8079593

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊

如果我們?cè)?Java 中談?wù)搱D形,我們只有一個(gè)線程負(fù)責(zé) EDT([1][事件調(diào)度線程])。換句話說,無論您想對(duì)視圖做什么,都將由 EDT 處理并且必須由 EDT 處理,是的,您的視圖也包含所有挫折、框架...

但請(qǐng)注意,它只是一個(gè)線程,當(dāng)這個(gè)線程忙于做一些計(jì)算時(shí),無法對(duì)用戶事件做出反應(yīng),因此您的視圖將凍結(jié)。您可以在另一個(gè)線程中做的是準(zhǔn)備數(shù)據(jù)(在您的情況下讀取文件圖像)

要在 EDT 中工作,您可以使用 SwingInvoker.invokelater() 或使用 swingutilities.isEventDispatchThread() 檢查您是否已經(jīng)在 EDT

[1] https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html


查看完整回答
反對(duì) 回復(fù) 2021-11-03
  • 2 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)