簡體   English   中英

更改JLabel的大小時如何動態縮放圖像

[英]How to dynamically scale an image when changing the size of the JLabel

我已將圖像讀取到JLabel中,並將圖像縮放到JLabel的大小,如下所示:

File file = new File ("C:/Users/Me/Desktop/TestImages/test.jpg");
BufferedImage image = ImageIO.read(file);

Image scaledImage = image.getScaledInstance(label.getWidth(), label.getHeight(), Image.SCALE_SMOOTH);
label.setIcon(new ImageIcon(scaledImage));

我正在使用提供的GroupLayout並將水平軸和垂直軸設置為“自動調整大小”(通過“設計”視圖),以便每當我更改窗口大小時,JLabel的大小都會自動調整為JFrame的大小。

現在,我想調整圖像的大小以及JLabel的大小,然后開始麻煩了。 我添加了一個事件處理程序,它響應於調整JFrame的大小,如下所示:

addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                addScaledImage(); // executes the lines above 
            }
        });

從理論上講這是可行的,但是非常慢。 因此,我嘗試將事件處理程序添加到JLabel而不是JFrame中,但這導致了另一個問題:圖像在不執行任何操作的情況下一直在擴展。 然后,我用JScrollPane包圍了JLabel,並將事件處理程序添加到JScrollPane中。 只要我擴展JFrame的大小,此方法就起作用。 但是,當我減小窗口大小時,圖像不會減小,而是保持不變。

  1. 有沒有一種更優雅的方式來集成事件處理程序(也許不需要JScrollPane的幫助)?

  2. 如何使我的圖像/ JLabel與任何調整大小事件一起自動調整大小(增加和減小JFrame的大小)? 是否有其他方法(例如,另一個LayoutManager)更適合於此?

  3. 另外,如果我想保持圖像的高寬比,是否有指定縮放方法?

我想調整圖像的大小以及JLabel的大小

您可以使用“ 拉伸圖標” 更改標簽尺寸時,它將自動縮放。 適用於任何可以顯示圖標的組件。

然后我用JScrollPane包圍了JLabel

但是,當我減小窗口尺寸時,圖像不會減小,而是保持不變

您不應該使用JScrollPane。 滾動窗格縮小時,添加到滾動窗格的組件的大小不會更改。 而是顯示滾動條。

我正在使用提供的GroupLayout並將水平和垂直軸設置為“自動調整大小”

我不會使用IDE來生成布局代碼,也不會使用GroupLayout,因為它對於這種簡單的事情來說過於復雜。

只需將標簽(使用StretchIcon)添加到框架即可。 默認情況下,框架使用BorderLayout,它將自動調整添加到BorderLayout的CENTER的任何組件的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM