毕业设计有个画图板,要求仿照windows附件的画图板,自己也做一个
有个功能就是要求画的图形可以改变叠放的次序,就是可以一个把另一个遮盖
有点类似于photoshop的图层功能,我不知道如何实现
望大虾指点!谢谢!
PS:我画图的容器是JLayeredPane。

解决方案 »

  1.   

    你可有考虑一下,用 swt 开发.
      

  2.   

    就是用JLayeredPane,JLayeredPane为Swing容器添加了深度,允许组件在需要时互相重叠。Integer对象指定容器中每个组件的深度,其中编号较高的组件位于其他组件之上。你所要做的就是改变深度使图层显示不同的重叠。
      

  3.   

    JLayeredPane为Swing容器添加了深度
    这个你说得对
    问题就是:难道我要画100个圆就要加100个JPanel吗?
    太夸张了啊~
      

  4.   

    你的要求中不是要能改变叠放的次序么画100个圆不用100个JPanel啊 要看100个圆分放在多少个图层上面呗
      

  5.   

    我所了解的暂时也只有用100个层了。
    下面是JavaAPI中使用层的大致规则,你的程序中是否遵守这个规则无所谓,按照程序需求书来决定层的使用。
    Frame Content 所在层: -30000
    默认层: 0
    拖拉层: 400
    弹出层: 300
      

  6.   

    我把作业要求贴出来吧!大家一起帮我想想怎么做吧!谢谢了!设计需求
    仿照Windows的附件程序“画图”,编制一个具有交互式绘制和编辑多种图元功能的程序,实现以下功能对应的设计内容:
    能够以交互方式在图形绘制区绘制点、直线(折线)、圆(椭圆)、圆弧、多边形、Beizer曲线、封闭区域填充、文字等基本图元;
    设置线条的颜色、线型和线条宽度,对绘制的图元进行线条和填充属性的修改;
    支持图元的点选和基于橡皮筋技术的圈选;
    对选中的图元进行平移、缩放、旋转和对称等变换;扩展功能:查看鼠标指针的当前坐标,查看选中图形的位置和尺寸信息;
    提供调色板功能(支持查色表);
    通过调节Beizer曲线的控制柄来修改曲线形状;
    提供菜单和命令按钮两种操作方式;
    改变图形的叠放层次;
    提供操作的撤销与恢复功能;
    能够保存和读取绘制的图形。
      

  7.   

    我现在碰到的问题就是图形叠放的层次啊~
    难道要画一个图形就要加一个JPanel……
      

  8.   

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class T extends JPanel {
    private List drawItemList = new ArrayList();

    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    for (int i = 0; i < drawItemList.size(); i++) {
    DrawItem item = (DrawItem) drawItemList.get(i);
    item.draw(g);
    }
    }

    public static void main(String[] args) {
    final T t = new T();
    t.drawItemList.add(new Rect(100, 100, 100, 100, Color.RED));
    t.drawItemList.add(new Circle(180, 180, 50, Color.BLUE));

    JButton btn = new JButton("改变次序");
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    Object item = t.drawItemList.remove(1);
    t.drawItemList.add(0, item);
    t.repaint();
    }
    }); JFrame f = new JFrame();
    f.getContentPane().add(t, BorderLayout.CENTER);
    f.getContentPane().add(btn, BorderLayout.SOUTH);
    f.setSize(400, 400);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);

    }
    }interface DrawItem {
    void draw(Graphics g);
    }class Rect implements DrawItem {
    private int x, y, w, h;
    private Color color;

    public Rect(int x, int y, int w, int h, Color color) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.color = color;
    } public void draw(Graphics g) {
    g.setColor(color);
    g.fillRect(x, y, w, h);
    }
    }class Circle implements DrawItem {
    private int x, y, r;
    private Color color;

    public Circle(int x, int y, int r, Color color) {
    this.x = x;
    this.y = y;
    this.r = r;
    this.color = color;
    } public void draw(Graphics g) {
    g.setColor(color);
    g.fillOval(x-r, y-r, r*2, r*2);
    }
    }
      

  9.   

    自定义一个图形类,基中有图形的对象和层次数据.定义一个存放图形的列表,这个列表先排好序,然后按顺序画出图形,后画的图形可能会把先画的图形挡住,这也可以算作是分出层次来了,要处理鼠标对图形的拖动的话,对图形进行鼠标事件捕捉,判断是哪一个图形得到鼠标事件,当然也要按图形的层次来判断,在上面的得到后,被挡信的图形就不能得到这个鼠标事件.当然,每个panel作为一个层,每个层有一个存放图形的列表.这个办法是笨了点,但应该能行.最后把列表中的对象用ObjectOutput输出,进行保存.下次启动程序的时候可以ObjectInput读取图形对象,然后进行再次编辑.
    努力.
    看看我的笨办法能不能行,可惜自己太懒,不想动手写.
      

  10.   

    楼上谢谢!
    也谢谢gtlang78() 这么辛苦提供了代码
    我还在读哦~
    不过问一下jorneyR
    你说的同一个层上的多个对象之间的叠放次序可以改吗?
      

  11.   

    忘了说一下,里面有个支持图元的点选和基于橡皮筋技术的圈选;
    我是用clearRect来实现橡皮筋技术的擦除的
    这个会不会把原来的图形也擦了啊?