问一个Swing做界面算是设计模式方面的问题,语言上应如何去实现

时间:2023-01-27 17:42:18
实现内容:
    要用java写applet程序,但是不想直接在页面里显示,所以做成了一个Frame,让它在页面里通过applet弹出作为java applet window.为了使用更强功能的界面元素,比如JSplitPane等,所以选用Swing来完成界面的设计。
    主界面类MainFrame由以下三个部分(类)组成
    1、主菜单  UIMenuBar.java
    2、工具栏  UIToolBar.java  在主菜单下,布局在BorderLayout.NORTH
    3、树型视图 UITreeView.java   在JScrollPane的左边
说明:JScrollPane是布局在BorderLayout.CENTER,在JScrollPane的右边是安置了一个ViewPort
      ---------------------------------------------------------
     |主菜单  UIMenuBar.java                                   |
     |---------------------------------------------------------|
     |工具栏  UIToolBar.java                                   | 
     |---------------------------------------------------------|
     |             |                                           |
     |             |                                           |
     |             |                                           |
     |             |                                           |
     |  树型视图   |                                           |
     |UITreeView.java                 ViewPort                 |
     |             |                                           |
     |             |                                           |
     |             |                                           |
     |             |                                           |
     |         JSplitPane                                      |   
     |             |                                           |
     |_____________|___________________________________________|
        
因为界面中的几个模块都写在单独的类中(要处理很多事件),统一由主窗体来组织显示,现在的问题就是有众多的事件需要监听,处理,主要也就是要在ViewPort区域重画内容。
比如说某项菜单的点击时需要在ViewPort中绘制一张图片,该事件的监听和处理方法我想应该还是在UIMenuBar.java中写,那么要能让UIMenuBar类操作ViewPort也应该把ViewPort的实例对象通过方法传递到UIMenuBar.java的相应事件的处理方法中

在UIMenuBar.java中
menuItem.addActionListener(this);//监听该菜单事件
.....

public void actionPerformed(ActionEvent e){
    if(点击了那个菜单){
    //to do 处理该事件的方法
         doDraw(viewport);
    }
}    

void doDraw(ViewPort viewport){
     //关键就是在这里应该怎么写才能在ViewPort部分绘制一张图片,
     //或者画一些几何图形,paint()? drawing()?
}

14 个解决方案

#1


简单点可以直接用JLabel或者JButton,用setIcon就可以把图表示出来

也可以自己写个component,直接把图画出来

#2


up

#3


用一个jpanel,然后在它上面画出来,

你只要建一个Image对象(如指定jpg文件),然后把这个Image传给jpanel画出来就可以了

#4


简单说我想问的意思是有一个类A和类B,其中类B继承自JFrame

怎么样在A的方法在实现在B的面板上绘制图??

class A{
    public void ff(){
        //TO DO  在这里实现往B的面板中绘图。
    }
}

class B extends JFrame{

}

#5


我的观点:
1.画图的功能代码应该另行封装,不应该直接写在UIMenuBar.java中。
2.绘制图片的方法只需要一个Image对象和一个Graphics2D对象即可,使用后者的drawImage方法应该可以满足你要求的画图方式
viewport对象好象不能直接在上面绘图吧,可能要装入一个JPanel作为画板:
JViewport viewport = new JViewport();
JPanel view = new JPanel();

view.add(new JLabel(
new ImageIcon("copy.gif")));

viewport.setView(view);

#6


顶一下

#7


同意Abib的看法。
事件处理部分因该和界面完全分离。
绘图部分只要传入一个Graphics对象的引用即可,没理由和界面放在一起。
建议楼主看看MVC模式方面的材料

#8


A 要在B里画图:

A.draw(Graphics g){
}

B {
paint(Graphics g){
A.draw(g);
}
}

#9


上面的他码为什么不能直接调用呢
比如写成
A 要在B里画图:

A.draw(Graphics g){
}

B {
//paint(Graphics g){
A.draw(g);
//}
}

#10


我无话可说了,请你买本Java语法书和Swing书好好看看吧.

#11


要想在B组件中画图必须让 B失效(invalidate,repaint) -> 系统调用B.paint(Graphics g),如果你想在B中画A的东西,必须将Graphics g传给A,让A自己画. 在这之前,B必须得到A的实例.

其实最大的问题和以上程序的逻辑无关.是语法和Swing知识薄弱.

#12


我想了解的是一个架构模式,项目中会有很多类,想怎么把显示和事件处理分离。

#13


介绍一种MVC,其实我也不懂,哈哈
要不BARRACUDA来实现,你可以轻松实现显示和控制的区分!

#14


不知道你的问题是需要用什么模式,还是怎样在 Viewport中画图?
如果是需要用什么模式的话,我认为无所谓模式,只要代码逻辑划分清晰就可以了.
至于在viewport中画图,前面已经答过了,使用一个可视对象加在viewport中,在可视对象的paint()方法中处理就可以了.

#1


简单点可以直接用JLabel或者JButton,用setIcon就可以把图表示出来

也可以自己写个component,直接把图画出来

#2


up

#3


用一个jpanel,然后在它上面画出来,

你只要建一个Image对象(如指定jpg文件),然后把这个Image传给jpanel画出来就可以了

#4


简单说我想问的意思是有一个类A和类B,其中类B继承自JFrame

怎么样在A的方法在实现在B的面板上绘制图??

class A{
    public void ff(){
        //TO DO  在这里实现往B的面板中绘图。
    }
}

class B extends JFrame{

}

#5


我的观点:
1.画图的功能代码应该另行封装,不应该直接写在UIMenuBar.java中。
2.绘制图片的方法只需要一个Image对象和一个Graphics2D对象即可,使用后者的drawImage方法应该可以满足你要求的画图方式
viewport对象好象不能直接在上面绘图吧,可能要装入一个JPanel作为画板:
JViewport viewport = new JViewport();
JPanel view = new JPanel();

view.add(new JLabel(
new ImageIcon("copy.gif")));

viewport.setView(view);

#6


顶一下

#7


同意Abib的看法。
事件处理部分因该和界面完全分离。
绘图部分只要传入一个Graphics对象的引用即可,没理由和界面放在一起。
建议楼主看看MVC模式方面的材料

#8


A 要在B里画图:

A.draw(Graphics g){
}

B {
paint(Graphics g){
A.draw(g);
}
}

#9


上面的他码为什么不能直接调用呢
比如写成
A 要在B里画图:

A.draw(Graphics g){
}

B {
//paint(Graphics g){
A.draw(g);
//}
}

#10


我无话可说了,请你买本Java语法书和Swing书好好看看吧.

#11


要想在B组件中画图必须让 B失效(invalidate,repaint) -> 系统调用B.paint(Graphics g),如果你想在B中画A的东西,必须将Graphics g传给A,让A自己画. 在这之前,B必须得到A的实例.

其实最大的问题和以上程序的逻辑无关.是语法和Swing知识薄弱.

#12


我想了解的是一个架构模式,项目中会有很多类,想怎么把显示和事件处理分离。

#13


介绍一种MVC,其实我也不懂,哈哈
要不BARRACUDA来实现,你可以轻松实现显示和控制的区分!

#14


不知道你的问题是需要用什么模式,还是怎样在 Viewport中画图?
如果是需要用什么模式的话,我认为无所谓模式,只要代码逻辑划分清晰就可以了.
至于在viewport中画图,前面已经答过了,使用一个可视对象加在viewport中,在可视对象的paint()方法中处理就可以了.