因此,我有一个JPanel对象作为JFrame的组件,并且我定期用Timer对象重新绘制JPanel的内容。除了在JFrame菜单顶部重绘JPanel时,一切都工作正常,因此导致菜单项无法读取。有没有办法解决这个问题,而不必每次用户访问菜单时都暂停计时器?Janel内的JFrame在JFrame的菜单顶部绘制
控制框架类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ControlFrame extends JFrame implements ActionListener{
/*======Public Constants======*/
public static int DEFAULT_HEIGHT = 400;
public static int DEFAULT_WIDTH = 400;
/*======Private Instance Variables======*/
private AnimationPanel animPane;
private JMenu menu;
private JMenuItem menuExit;
private JMenuBar menuBar;
/*======Constructors======*/
public ControlFrame(){
initialize();
}
/*======Public Instance Methods======*/
public void actionPerformed(ActionEvent ae) {
if(ae.getActionCommand().equals("exit")){
System.exit(0);
}
}
/*======Private Instance Methods======*/
private void initialize(){
this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(0,2));
this.animPane = new AnimationPanel(this.getWidth(), this.getHeight());
this.add(animPane);
createCFMenu();
this.setVisible(true);
}
private void createCFMenu(){
this.menuBar = new JMenuBar();
this.menu = new JMenu("File");
this.menu.setMnemonic(KeyEvent.VK_F);
this.menuBar.add(this.menu);
this.menuExit = new JMenuItem("Exit", KeyEvent.VK_X);
this.menuExit.addActionListener(this);
this.menuExit.setActionCommand("exit");
this.menu.add(menuExit);
this.setJMenuBar(this.menuBar);
}
/*======Main Method======*/
public static void main(String[] args){
ControlFrame cf = new ControlFrame();
}
}
AnimationPanel类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class AnimationPanel extends JPanel implements ActionListener{
/*======Private Instance Variables======*/
private int timeInterval;
private Timer animTimer;
/*======Constructor======*/
public AnimationPanel(int width, int height){
timeInterval = 50;
this.setSize(width, height);
this.animTimer = new Timer(timeInterval, this);
animTimer.start();
}
public void actionPerformed(ActionEvent arg0) {
paint();
}
/*======Private Instance Variables======*/
private void paint(){
BufferedImage bImage = new BufferedImage(this.getWidth(),
this.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics bg = bImage.getGraphics();
bg.setColor(Color.WHITE);
bg.fillRect(0, 0, bImage.getWidth(), bImage.getHeight());
this.getGraphics().drawImage(bImage, 0, 0, this);
}
}
问题是动画面板是在ControlFrames菜单
解决方案是修复您的代码中的错误。如果您需要我们的帮助,您需要显示该代码,或者其中的一部分。要发布的最佳代码是创建一个[SSCCE](http://sscce.org),它是一个最小的可编译和可运行程序,可以显示您的问题,并且没有与手头问题无关的代码。我不太清楚你如何在没有这些重要信息的情况下猜测错误,但也许是因为你是新来的。顺便提一下,欢迎使用stackoverflow。 – 2012-02-04 04:30:32
添加了代码。 – pmurph 2012-02-04 04:53:06
发布代码的好处。 +1 – 2012-02-04 05:05:53