免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1180 | 回复: 0
打印 上一主题 下一主题

java绘图问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-22 20:47 |只看该作者 |倒序浏览
最近由于神经网络课程需要做一个关于bp网络的编程题,在编程过程中,我需要对bp网络的拓扑结构进行图形输出,具体输出为一个类似树状的结构。
总结一下最近我在利用java语言进行绘图时碰到的几个问题(菜鸟级别的,不要见笑哦):
1.在弹出的窗体中进行绘图。
过程:Jframe1通过点击菜单“绘制拓扑图”调用jframe2,并在jframe2上绘制出拓扑图,绘图过程是在jframe2的paint函数中实现的。   
问题:我第一次试验的时候,在菜单的消息相应函数中直接添加了如下代码
   JDrawTuop jt= new JDrawTuop(in,mid,out);//绘图用的三个参数
   jt.setExtendedState(JFrame.MAXIMIZED_BOTH);
   jt.setVisible(true);
运行之后显示了第二个窗体,但是绘图出现了问题,绘制的图形出来了,可是第一个窗体的菜单的痕迹还是留在了第二个窗体上,而且在移动窗体的时候,窗体边界没有被重绘,但是窗体内部的图形还是一直有的。
  jframe2中paint函数用来绘制拓扑图,代码如下:
  public void paint(Graphics g)
    {
        Color c = new Color(255,0,0);
        g = this.jPanel1.getGraphics();
        g.setColor(c);
        Point p1= new Point();
        Point p2= new Point();
        Point p3= new Point();
        g.drawString("BP网络拓扑图:", 0, 20);
        g.drawString("输入层", 30, 60);
        g.drawString("隐藏层", 200, 50);
        g.drawString("输出层", 400, 50);
        for(int i=0;i
经过查找资料,paint函数由父类自动维护,并且如果子类一旦重载该函数,必须自己去维护所有的界面显示。这句话的意思也就是说,如果paint没有被重载,那么所有窗口及窗口内的控件都有super.paint来实现,但是如果我们一旦重写了paint函数,就必须把窗口重绘的内容也要重写了,但是实际上没有那么麻烦,我们只要在重载的paint函数中加入super.paint(g)这句话就行了。加上之后,我的程序就正常了。
2.窗口内绘制的图形超出了窗体的大小,没有滚动条显示出来。
过程:在jframe2窗口中,加入一个jscrollpane,然后再在它的基础上加一个jpane,然后再jpane上进行绘图。但是程序运行之后,没有出现滚动条。
问题解决:我在可视化编辑状态下,拖放jscrollpane控件时,发现当它比jpane小时,滚动条就出现了,然后我又查看了jpane的preferredsize是固定的(100.100),我在程序中没有对他的大小进行修改,也就是说,我在这种编辑状态下jscrollpane和jpane的位置关系并没有随着绘图的大小发生改变。经过上网查找资料,我发现:jscrollpane是否出现滚动条,完全取决于其内部控件的preferredsize的值。问题找到了,解决办法就是:在绘图过程中,随着图形的大小来动态修改jpane的preferredsize的值,这样滚动条就会出现了,我的代码如下:this.jPanel1.setPreferredSize(new Dimension(500,big*80+50));
其中big为图形绘制时的最下边界,500为宽度。
3.滚动条出现了,但是当滚动的时候,图形没有被重新绘制。
问题的解决:根据java的消息相应机制,之所以滚动条滚动时没有重新绘制,也就是说在滚动条滚动的事件发生时,没有相应函数,所以我就想通过可视化的编辑状态中给他加上消息相应函数,可是由于jscrollpane把滚动条集成起来了,我在jscrollpane的消息相应函数中没有找到对滚动条滚动的相应事件(adjustablelistener)。经过查找java的帮助文档,我发现JScrollPane 管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口,JScrollPane 基本上由 JScrollBar、一个 JViewport 以及它们之间的连线组成除了滚动条和视口之外,JScrollPane 也可以有一个列标题和一个行标题。这二者都是 JViewport 对象。在jscrollpane的方法中可以获得其包含的任何组件比如滚动条。如果获得了这个滚动条,我们不久可以在程序中自动添加消息相应了吗,下面就是我的代码:
JScrollBar   jVerticalScrollBar   =  this.jScrollPane1.getVerticalScrollBar();   
jVerticalScrollBar.addAdjustmentListener(new  AdjustmentListener()   
    {   
       public   void   adjustmentValueChanged(AdjustmentEvent e)   
          {   
             jtp.repaint();
           }   
     });
这里添加消息相应是通过内部类的方式实现的。jtp就是我们的当前的窗口类对象,通过它来实现了滚动条滚动时,对窗口的重绘操作,从而调用了paint方法,图形就会出来了:)





本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66402/showart_573049.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP