2013-12-12 2 views
1

배경 이미지가있는 JMenubar와 JPanel이있는 JFrame을 만들려고합니다. 지금까지 2 개의 창, JFrame 및 JPanel을 작성한 코드, JFrame에는 JMenuBar가 있으며 JPanel에는 배경이 있습니다. 이들을 하나의 창에 함께 넣을 수 있습니까?JMenuBar가있는 JFrame과 Java Netbeans의 배경

package RPGPackage; 

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 
import javax.swing.JMenuBar; 

public class RPG extends JFrame { 

    public RPG() { 
     JFrame frame = new JFrame("RPG"); 
     frame.setVisible(true); 
     frame.setSize(1005,710); 
     frame.setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     frame.add(panel); 
     setLocation(0,0); 
     setVisible(true); 
     setSize(1005,710); 
     setResizable(false); 

     JMenuBar menubar = new JMenuBar(); 
     frame.setJMenuBar(menubar); 

     JMenu file = new JMenu("File"); 
     file.setMnemonic(KeyEvent.VK_A); 

     menubar.add(file); 

     JMenuItem Load = new JMenuItem("Load",KeyEvent.VK_L); 
     file.add(Load); 

     JMenuItem Save = new JMenuItem("Save",KeyEvent.VK_S); 
     file.add(Save); 

     JMenuItem exit = new JMenuItem(new AbstractAction("Quit"){//Adds Exit button 
     public void actionPerformed(ActionEvent e) {//adds an action to the JMenuItem  "Exit" 
     System.exit(0);}//when action is performed program will exit 
     }); 
     file.add(exit);//adds the JMenuitem to the JMenuBar thats above. 

     Background background = new Background(); 
     add(background); 
    } 

    public static void main(String[] args) { 
      RPG window = new RPG(); 
    } 
} 







package RPGPackage; 

import java.awt.Graphics; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Background extends JPanel { 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     ImageIcon background = new ImageIcon("Image.png"); 

     background.paintIcon(this, g, 0, 0); 
    } 
} 

답변

0

1) RPG 클래스는 프레임

(JFrame frame = new JFrame("RPG");)의 다른 인스턴스를 만들 필요가 없습니다, JFrame 확장합니다. RPG 인스턴스를 사용하십시오.

2) 대신 ImageIconBufferedImage를 사용하고 다음과 같이 이미지를 그린다

private BufferedImage img = ImageIO.read(getClass().getResourceAsStream("Image.png")); 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawImage(img, 0, 0, this); 
} 

3) 인터페이스 구조의 끝에서 또는 다음과 같은 setVisible(true);를 호출

SwingUtilities.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     setVisible(true); 
    } 
}); 

4) setResizable를 (그릇된); 나쁜 습관입니다. LayoutManager의 도움으로 부품 크기 조정을 관리하십시오.

5) 대신 내가 코드를 해결 한 setSize(...)

pack(); 방법을 사용하여, 그것을 검토 :

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 

public class RPG extends JFrame { 

    public RPG() { 
     super("RPG"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 

     JMenuBar menubar = new JMenuBar(); 
     setJMenuBar(menubar); 

     JMenu file = new JMenu("File"); 
     file.setMnemonic(KeyEvent.VK_A); 

     menubar.add(file); 

     JMenuItem Load = new JMenuItem("Load", KeyEvent.VK_L); 
     file.add(Load); 

     JMenuItem Save = new JMenuItem("Save", KeyEvent.VK_S); 
     file.add(Save); 

     JMenuItem exit = new JMenuItem(new AbstractAction("Quit") { 

      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     }); 
     file.add(exit); 

     Background background = new Background(); 
     add(background); 

     setSize(200,200); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     RPG window = new RPG(); 
    } 

    class Background extends JPanel { 

     private BufferedImage img; 

     public Background() { 
      try { 
       img = ImageIO.read(getClass().getResourceAsStream("Image.png")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.drawImage(img, 0, 0, this); 
     } 

    } 
} 

을 또한 당신이, 당신을하는 데 도움이 잡고 그림에 대한 JLabel를 사용할 수있는 대신 이미지를 회화의 상자에서 일부 기능을 얻으려면 :

class Background extends JPanel { 

    private ImageIcon img; 

    public Background() { 
     URL resource = getClass().getResource("Image.jpg"); 
     img = new ImageIcon(resource); 
     JLabel l = new JLabel(img); 
     add(l); 
    } 
} 
관련 문제