2013-11-30 3 views
0

Я получаю сообщение об ошибке с любыми темами, которые я могу найти по этой проблеме. В значительной степени я просто хотел добавить фона к своей JPanel.Добавление фонового изображения в JPanel

Мой код:

package org.client; 

import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

/** 
* 
* @author Ryan Taubert || Dev.Ryanj 
* @version 0.1 
* 
*/ 

public class Main extends JFrame { 
    private static final long serialVersionUID = -7729008412395425144L; 
    private BufferedImage img; 

    private static double APP_VERSION = 0.1; 
    private static String APP_NAME = "Launcher ~ Version: "+APP_VERSION; 

    private JPanel jp; 
    private JTextField jUsername; 
    private JTextField jPassword; 

    /** 
    * Width/Height 
    */ 
    private int x = 1280, y = 720; 


    /** 
    * Launch the Application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       System.out.println("System: [Starting Application: "+APP_NAME+"]"); 
       try { 
        Main frame = new Main(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Launch Panel 
    */ 
    public Main() { 
     setTitle("Ryan's JLauncher"+APP_NAME); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, x, y); 
     jp = new JPanel(); 
     try { 
       img = ImageIO.read(new File("C:\\Users\\Ryan T\\Desktop\\wNSE6p7.jpg")); 
      } catch(IOException e) { 
       e.printStackTrace(); 
      } 
     //jp.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(jp); 
     jp.setLayout(null); 

     /** 
     * ``TextFields`` 
     */ 
     //username 
     jUsername = new JTextField(10); 
     jUsername.setBounds(6, 30, 50, 20); 
     jUsername.setOpaque(false); 
     jUsername.setBorder(null); 
     jp.add(jUsername); 

     //password 
     jPassword = new JTextField(10); 
     jPassword.setBounds(6, 30, 50, 20); 
     jPassword.setOpaque(false); 
     jPassword.setBorder(null); 
     jp.add(jPassword); 

     /** 
     * ``Labels`` 
     */ 
     //username 
     JLabel username = new JLabel("Username"); 
     username.setBounds(15, 11, 50, 14); 
     jp.add(username); 

     //password 
     JLabel password = new JLabel("Password"); 
     password.setBounds(15, 11, 50, 14); 
     jp.add(password); 


     /** 
     * Log Button 
     */ 
     JButton login = new JButton("Log In"); 
     login.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       handleStartClient(); 
      } 
     }); 
     login.setBounds(1, 60, 400, 30); 
     jp.add(login); 

     /** 
     * Create New Account Button 
     */ 
     JButton create = new JButton("Create New Account"); 
     create.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       handleStartClient(); 
      } 
     }); 
     create.setBounds(1, 120, 400, 30); 
     jp.add(create); 

    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponents(g); 
     g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
     } 

    private void handleStartClient() { 

    } 

} 

Метод краска из другого потока здесь, на StackOverflow & Это не не работает. Я делаю это неправильно или?

+0

Проверьте, существует ли файл изображения. Также убедитесь, что вызов 'img = ImageIO.read (..)' действительно загрузил файл. – Bitmap

ответ

4

JFrame не имеет paintComponent способ. Вы должны обернуть его в JPanel затем добавить эту панель в JFrame

public class Main exends JFrame{ 
    MyPanel panel; 
    private BufferedImage img; 

    public Main(){ 
     try { 
      img = ImageIO.read(new File("C:\\Users\\Ryan T\\Desktop\\wNSE6p7.jpg")); 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 
     panel= new MyPanel(); 
     add(panel); 
    }  

    private class MyPanel extends JPanel{ 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
     } 
    } 
} 

paintComponent является метод от JComponent. JFrame не является подтипом JComponent, это Container

Также см JPanel javadoc и JFrame javadoc

+0

Снова это меня путает. Я положил int код и я все еще получаю сообщение об ошибке ..... Это ничего не изменило. Обновлен основной поток. – Ryan

Смежные вопросы