我跑了下面的代碼10次。在10次運行中,3次顯示菜單欄和矩形,3次只顯示矩形,4次顯示沒有任何結果。我究竟做錯了什麼?Fickle JMenuBar
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static java.awt.Color.*;
import java.awt.image.*;
public class GUI extends JFrame implements KeyListener, ActionListener
{
int x, y;
public static void main(String[] args)
{
new GUI();
}
public GUI()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e)
{
e.printStackTrace();
}
frameInit();
setSize(1024,768);
setDefaultCloseOperation(EXIT_ON_CLOSE);;
setVisible(true);
setJMenuBar(createMenuBar());
addKeyListener(this);
createBufferStrategy(2);
x = 0;
y = 49;
}
public void paint(Graphics gm)
{
BufferStrategy bs = getBufferStrategy();
try
{
Graphics g = bs.getDrawGraphics();
super.paint(g);
g.setColor(WHITE);
g.drawRect(0,0,1024,768);
g.setColor(BLACK);
g.fillRect(x,y,100,100);
bs.show();
}catch(Exception e)
{
}
}
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);
menuBar.setLocation(0,23);
return menuBar;
}
public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
repaint();
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_UP)
{
y-=10;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
y+=10;
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
x-=10;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
x+=10;
}
repaint();
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
}
只是出於好奇,關於子類分類JFrame – resotpvl 2010-01-14 20:00:53
有什麼不好?因爲通過繼承你將你的類綁定到JFrame非常深入,在這種情況下,現在是必要的。重新定義類的行爲時,應該繼承(子類),當功能發生變化時,不僅在數據發生變化時。在這個例子中,你只是使用JFrame,沒有理由繼承它。繼承也使得執行單元測試變得更加困難(因爲要測試你的代碼,你必須始終創建一個JFrame),同時使用組合可以單獨測試你的功能。繼承是在OOP中的地位,但不應該被濫用。 – OscarRyz 2010-01-14 21:33:42