2009-12-18 7 views
1

결국 다음 코드를 사용하여 게임을 만들려고합니다. 코드는 아래와 같이 작동합니다.페인트 메서드를 추가하면 JMenuBar가 사라집니다.

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



public class GUI extends JFrame implements ActionListener 
{ 
public static void main(String[] args) 
{ 
    GUI g = new GUI(); 
} 
public GUI() 
    { 
    try 
    { 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
    setSize(500,500); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setJMenuBar(createMenuBar()); 
    setVisible(true); 
    } 
public JMenuBar createMenuBar() 
    { 
    JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     fileMenu.setMnemonic(KeyEvent.VK_F); 
     JMenuItem save = new JMenuItem("Save"); 
     save.setMnemonic(KeyEvent.VK_S); 
     save.addActionListener(this); 
     JMenuItem load = new JMenuItem("Load"); 
     load.setMnemonic(KeyEvent.VK_L); 
     load.addActionListener(this); 
     JMenuItem quit = new JMenuItem("Quit"); 
     quit.setMnemonic(KeyEvent.VK_Q); 
     quit.addActionListener(this); 
     fileMenu.add(save); 
     fileMenu.add(load); 
     fileMenu.addSeparator(); 
     fileMenu.add(quit); 
     JMenu editMenu = new JMenu("Edit"); 
     editMenu.setMnemonic(KeyEvent.VK_E); 
     JMenuItem undo = new JMenuItem("Undo"); 
     undo.setMnemonic(KeyEvent.VK_U); 
     undo.addActionListener(this); 
     JMenuItem redo = new JMenuItem("Redo"); 
     redo.setMnemonic(KeyEvent.VK_R); 
     redo.addActionListener(this); 
     editMenu.add(undo); 
     editMenu.add(redo); 
     JMenu helpMenu = new JMenu("Help"); 
     helpMenu.setMnemonic(KeyEvent.VK_H); 
     JMenuItem controls = new JMenuItem("Controls"); 
     controls.setMnemonic(KeyEvent.VK_C); 
     controls.addActionListener(this); 
     JMenuItem about = new JMenuItem("About"); 
     about.setMnemonic(KeyEvent.VK_A); 
     about.addActionListener(this); 
     helpMenu.add(controls); 
     helpMenu.addSeparator(); 
     helpMenu.add(about); 
     menuBar.add(fileMenu); 
     menuBar.add(editMenu); 
     menuBar.add(helpMenu); 
     return menuBar; 
    } 
public void actionPerformed(ActionEvent e) 
{ 
    System.out.println(e.getActionCommand()); 
} 
} 

그러나 그림과 같이 페인트 방법을 넣으면 JMenuBar가 표시되지 않습니다.

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



public class GUI extends JFrame implements ActionListener 
{ 
public static void main(String[] args) 
{ 
    GUI g = new GUI(); 
} 
public GUI() 
    { 
    try 
    { 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
    setSize(500,500); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setJMenuBar(createMenuBar()); 
    setVisible(true); 
    } 
public JMenuBar createMenuBar() 
    { 
    JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     fileMenu.setMnemonic(KeyEvent.VK_F); 
     JMenuItem save = new JMenuItem("Save"); 
     save.setMnemonic(KeyEvent.VK_S); 
     save.addActionListener(this); 
     JMenuItem load = new JMenuItem("Load"); 
     load.setMnemonic(KeyEvent.VK_L); 
     load.addActionListener(this); 
     JMenuItem quit = new JMenuItem("Quit"); 
     quit.setMnemonic(KeyEvent.VK_Q); 
     quit.addActionListener(this); 
     fileMenu.add(save); 
     fileMenu.add(load); 
     fileMenu.addSeparator(); 
     fileMenu.add(quit); 
     JMenu editMenu = new JMenu("Edit"); 
     editMenu.setMnemonic(KeyEvent.VK_E); 
     JMenuItem undo = new JMenuItem("Undo"); 
     undo.setMnemonic(KeyEvent.VK_U); 
     undo.addActionListener(this); 
     JMenuItem redo = new JMenuItem("Redo"); 
     redo.setMnemonic(KeyEvent.VK_R); 
     redo.addActionListener(this); 
     editMenu.add(undo); 
     editMenu.add(redo); 
     JMenu helpMenu = new JMenu("Help"); 
     helpMenu.setMnemonic(KeyEvent.VK_H); 
     JMenuItem controls = new JMenuItem("Controls"); 
     controls.setMnemonic(KeyEvent.VK_C); 
     controls.addActionListener(this); 
     JMenuItem about = new JMenuItem("About"); 
     about.setMnemonic(KeyEvent.VK_A); 
     about.addActionListener(this); 
     helpMenu.add(controls); 
     helpMenu.addSeparator(); 
     helpMenu.add(about); 
     menuBar.add(fileMenu); 
     menuBar.add(editMenu); 
     menuBar.add(helpMenu); 
     return menuBar; 
    } 
    public void paint(Graphics g) 
    { 
    } 
public void actionPerformed(ActionEvent e) 
{ 
    System.out.println(e.getActionCommand()); 
} 
} 

농담조차하지 마세요. 도와주세요

답변

3

Component.paint은 구성 요소를 그립니다. 이 경우 전체 JFrame.

paint(Graphics g)을 오버라이드하지만 super.paint(g)이라고 부르지 않으면 모든 렌더링이 JFrame으로 중단되었습니다.

페인트 방법에 super.paint(g)을 추가하기 만하면 문제가 해결됩니다.

+0

내 생성자에 super.paint 메서드를 추가 할 수 있습니까, 아니면 페인트 메서드에 넣어야합니까? – resotpvl

+0

페인트 메서드에서. –

0

JFrame에 추가 한 구성 요소는 JFrame의 페인트 방법으로 그려집니다.

자신의 그림을 그리기 전에 기본 클래스의 페인트 방법을 자신의 것으로부터 호출하고 싶습니다.

관련 문제