2017-03-25 74 views
0

的了setPreferredSize我試圖理解爲什麼下面的一小段代碼不起作用。 我明白,當沒有佈局或組件的大小爲0時,不調用繪畫組件方法。的paintComponent()不叫儘管JPanel的

但是,這是不是這裏的情況。

你能解釋爲什麼我不能爲這種背景?

public class Login extends JPanel { 

    private BufferedImage bgImage; 

    public Login() { 
     super(); 
     initImages(); 
     setLayout(new BorderLayout()); 

     setPreferredSize(new Dimension(600, 600)); 
     add(new JLabel("Hi"), BorderLayout.CENTER); 
    } 

    private void initImages() { 
     try { 
      bgImage = ImageIO.read(new File("images/login.jpg")); 
      System.out.println("image loaded"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("image not loaded"); 
     } 
    } 

    @Override 
    public void paintComponents(Graphics g) { 
     super.paintComponents(g); 
     g.drawImage(bgImage, 0, 0, null); 
     System.out.println("repaint"); 
    } 

    public static void createAndShowGui() { 
     JFrame frame = new JFrame(); 
     Login login = new Login(); 
     frame.add(login, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+0

'paintComponents'應是'paintComponent' – MadProgrammer

+0

所以我改變了'paintComponents'爲'paintComponent'和它的作品對我很好 - 而且,明白了什麼'paintComponent'呢,如果你嘗試繪畫調用它的'super'方法之前,任何事情你的油漆將被刪除 – MadProgrammer

+0

哦哇所以paintComponents不同於paintComponent .. 因此,paint,paintComponents和paintComponent ..如果您發佈您的評論作爲答案。我會選擇你的。謝謝。 – zcahfg2

回答

1

如果你想要這個工作,那麼你將需要改變......

@Override 
public void paintComponents(Graphics g) { 
    super.paintComponents(g); 
    g.drawImage(bgImage, 0, 0, null); 
    System.out.println("repaint"); 
} 

到更多的東西一樣......

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(bgImage, 0, 0, this); 
} 

paintComponent負責畫「底」的組件層,paintComponents負責畫兒

+0

謝謝你的解決方案。經過一番研究後,我發現在paintComponent方法中加載圖像並不理想,因爲此方法被重複調用(並且有時會快速連續),因此會消耗不必要的資源。有沒有更好的方法來加載背景圖片? – zcahfg2

+1

你基本上做的是正確的方法,將它加載到構造函數中 – MadProgrammer

相關問題