这是我写的一个简单类,就是在菜单项上点击就在jpanel上画条线,这是可以的,但是
public class myFrame extends JFrame {
JMenuBar mb = new JMenuBar();
JMenu mn = new JMenu();
JMenuItem mi = new JMenuItem();
JTabbedPane tab = new JTabbedPane();
JPanel panel = new JPanel();
public myFrame() {
this.setSize(400, 400);
this.getContentPane().setLayout(new BorderLayout());
tab.addTab("hi", panel);//注意这一句,称它为1句,如果放在这里点菜单项就可以正常画线,但如果放到菜单项动作响应函数里就画不出来,请问这是为什么?
this.getContentPane().add(tab, BorderLayout.CENTER);
                this.setJMenuBar(mb);
mb.add(mn);
mn.setText("test");
mn.add(mi);
mi.setText("test");
mi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
                     
                             //tab.addTab("hi", panel);放到这里就画不出来
     panel.getGraphics().drawLine(10, 10, 100, 100);//点击菜单项就画线
} });
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
} };
this.addWindowListener(wndCloser);
}
}

解决方案 »

  1.   

    这应该是一个逻辑错误。在菜单的actionPerformed()方法执行完成后(从此方法返回),由于容器发生变化,上层容器自动刷新所有子组件,你的Panel也被刷新,而绘制直线的代码处于刷新之前,所以没有任何内容(绘制但被擦除了)。
        在你的“第1句中”,组件先被加入,点菜单时只绘制,组件没有刷新,因此可以绘出来(这是符合逻辑的方法。但试一个最小化再还原,线不在了。也是因为组件自动刷新的原因)。
      

  2.   

    lzmailcn,你说的对,我能看到我画的线一闪而过,说明被刷新了,那我该怎么办?请指教,我现在就想对不同的按钮点过以后画不同的图,帮帮我!
      

  3.   

    大体说,你需要持有你的绘制内容。大概说下思路吧:
    1.定义一些你的图形元件类,保证它们继承自同一个类(或接口),如果不想写,用java.awt下的基本元件(如点,直线,圆等);
    2.用一个表持有这些元件,如java.util.ArrayList<Shap> graphs=new java.util.ArrayList<Shap>(),当完成一个图元的绘制后,将它加入表中,同时刷新组件;
    3.覆写组件(一般是JPanel或Canvas)的paint()方法,在方法中绘制全部组件(这里暂不考虑性能),如:
    public void paint(java.awt.Graphics g){
        super.paint(g);    java.awt.Paint bakPaint=g.getPaint();
        
        g.setPaint(java.awt.Color.RED);
        for(Shap shap:graphs){
            g.draw(shap);
        }    g.setPaint(bakPaint);
    }
    这样就保证图元在任何时侯都可见。
    4.java.awt.geom包里有很多2D图元类,你参考一下。肆深入研究,目前好象只有一本书叫《Java2D Graphics》的书,是英文的,我找了一下,机器中没有了,你去Google一下。
      

  4.   

    2.用一个表持有这些元件,如java.util.ArrayList <Shap>   graphs=new   java.util.ArrayList <Shap> (),当完成一个图元的绘制后,将它加入表中,同时刷新组件;
    这里最后一句“同时刷新组件”,请问怎么刷新?