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

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

如何在 JFrame 上顯示兩個(gè)帶有圖像的 JPanel,并且兩個(gè) img 都可見?

如何在 JFrame 上顯示兩個(gè)帶有圖像的 JPanel,并且兩個(gè) img 都可見?

炎炎設(shè)計(jì) 2021-09-15 10:25:32
我試圖將一個(gè)水族館(它是一個(gè)擴(kuò)展JPanel并包含水族館 img 的類)設(shè)置為背景,并在頂部設(shè)置一條魚(它也是一個(gè)擴(kuò)展 aJPanel并包含魚 img 的類)。問題是它只顯示一個(gè)圖像,而不是水族箱頂部的魚(水族箱或魚,取決于首先添加到 中的那個(gè)JFrame)。主要的public class Core {    JFrame window;    JLabel label;    ImageIcon img;          Aquarium aquarium = new Aquarium();    JavaFish javaFish = new JavaFish();    public void start() {        window = new JFrame();        window.setPreferredSize(new Dimension(600, 400));        window.setVisible(true);        window.setTitle("Java Game");        aquarium.add(javaFish);        window.add(aquarium);        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    }    public static void main(String[] args) {        Core c = new Core();        c.start();    }}水族館public class Aquarium extends JPanel {    private BufferedImage img;    //Initiate aquarium width     public int width;    //Initiate aquarium height    public int height;    @Override    protected void paintComponent(Graphics g) {        width = getSize().width;        height = getSize().height;        try {            img = ImageIO.read(new File("img/AquariumBackground.png"));        } catch (IOException e) {            e.printStackTrace();            System.out.println("Image not fount!");        }        g.drawImage(img, 0, 0, width, height, this);    }               }魚public class JavaFish extends JPanel {    BufferedImage img;    int xPos = 50;    int yPos = 50;    public JavaFish() {        this.setOpaque(false);    }    @Override    protected void paintComponent(Graphics g) {        BufferedImage JavaFish = LoadImage("img/JavaFish.png");        Graphics2D g2d = (Graphics2D) g;        g2d.drawImage(JavaFish, xPos, yPos, 100, 100, null);        repaint();    }    BufferedImage LoadImage(String FileName) {        img = null;        try {            img = ImageIO.read(new File (FileName));        } catch (IOException e) {            e.printStackTrace();        }        return img;    }}
查看完整描述

1 回答

?
繁花不似錦

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

問題是它只顯示一個(gè)圖像,而不是水族箱頂部的魚(水族箱或魚,取決于首先將哪個(gè)圖像添加到 JFrame)。

默認(rèn)情況下 aJPanel使用 a FlowLayout,它尊重添加到它的任何組件的首選大小。

默認(rèn)情況下 aJFrame使用 a BorderLayout,如果您不指定約束,組件將添加到CENTERBorderLayout,這意味著組件會(huì)自動(dòng)調(diào)整大小以填充框架的空間。

因此,您添加到框架的組件將調(diào)整大小以填充框架。添加到面板的組件的大小為 (0, 0),因此無需繪制任何內(nèi)容。

所以一些自定義繪畫技巧:

  1. 覆蓋getPreferredSize()面板的方法以返回圖像的大小,以便布局管理器可以完成其工作

  2. 調(diào)用 super.paintComponent(..) 作為確保背景被清除的第一條語句。

  3. 不要在paintComponent() 方法中讀取圖像。每當(dāng) Swing 確定需要重新繪制組件時(shí),都可以調(diào)用此方法,因此繼續(xù)讀取圖像效率不高。相反,應(yīng)該在類的構(gòu)造函數(shù)中讀取圖像。

  4. 不要在繪畫方法中調(diào)用 repaint() 。這將導(dǎo)致無限的繪畫循環(huán)。

此外,在使框架可見之前,應(yīng)將組件添加到框架中。

綜上所述,Alerra 在評(píng)論中建議在同一面板中繪制兩個(gè)圖像是一個(gè)好主意。它簡(jiǎn)化了繪畫,您甚至可以通過保留要繪制的圖像的 ArrayList 輕松繪制多條魚。然后您只需繪制背景,然后遍歷 ArrayList 以繪制單個(gè)魚。

查看自定義繪畫方法以獲取工作示例。例子只畫了Rectangle,但是概念是一樣的。


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

添加回答

舉報(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)