这是我写的一个简单类,就是在菜单项上点击就在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);
}
}
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句中”,组件先被加入,点菜单时只绘制,组件没有刷新,因此可以绘出来(这是符合逻辑的方法。但试一个最小化再还原,线不在了。也是因为组件自动刷新的原因)。
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一下。
这里最后一句“同时刷新组件”,请问怎么刷新?