2012-07-11 59 views
1

即時通訊嘗試在使用面板調整大小的JPanel上設置背景圖像。我在顯示畫面沒問題,但只要我使用:JPanel縮放時不顯示背景圖片

background = background.getScaledInstance(300, -1, Image.SCALE_SMOOTH);

什麼也看不見了。任何想法爲什麼?

代碼:

import javax.swing.*; 
import java.awt.*; 

public class LoginJPanel extends JPanel 
{ 
    private Image background; 

    public LoginJPanel() 
    { 
    super(); 

    background = new ImageIcon("C:\\ASYS\\Stories\\Authentication UI\\AVDsplashscreen_tiny.jpg").getImage(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    background = background.getScaledInstance(300, -1, Image.SCALE_SMOOTH); 
    g.drawImage(background, 0, 0, this); 
    } 

    public static void main (String[] args) 
    { 
     LoginJPanel ip = new LoginJPanel(); 
     JFrame jf = new JFrame(); 
     jf.setLayout (new BorderLayout()); 
     jf.add (ip, BorderLayout.CENTER); 
     jf.setSize (1000, 600); 
     jf.setLocation (150, 150); 
     jf.setVisible (true); 
     jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    } 
} 
+2

油漆方法應該只用於繪畫,不要在那裏縮放圖像,將其移到您的構造函數中。不是一個答案只是建設性的批評 – 2012-07-11 13:08:49

+0

你可以驗證繪製方法是否完成?縮放操作可能需要一定的時間才能完成 – MadProgrammer 2012-07-11 13:37:55

+0

而不是在'JFrame'上設置大小,您可以重寫[getPreferredSize()](http://docs.oracle.com/javase/7/docs/api/ javax/swing/JComponent.html#getPreferredSize()),然後您可以添加一個[ComponentListener](http://docs.oracle.com/javase/7/docs/api/java/awt/event/ComponentListener.html ),現在在你的'componentResized(...)'裏面,你可以添加你的'ScaledImage'東西,然後調用'repaint()',以實現更改:-) – 2012-07-11 19:56:54

回答

0

在我做了什麼是(通過評論的建議)移動縮放paint方法外底。我創建了從父組件稱爲公有方法來通知有關新尺寸面板,並縮放圖片acording到:

public void initSize(int _width, int _height) 
    { 
    int h = background.getHeight(null); 
    int w = background.getWidth(null); 

    if (w - _width > h - _height) 
    { 
     scaleVertically(_width, _height); 
    } 
    else 
    { 
     scaleHorizontally(_width, _height); 
    } 
    } 

我想我應該做一些聽衆,因爲這不是很優雅,但我不知道如何去做。