`
zwhc
  • 浏览: 265890 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

飞屋。代码更改。

阅读更多
http://www.iteye.com/topic/650762 的代码做一些修改。
原来的代码,主要用鼠标,很麻烦。


package house;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Point2D;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Hashtable;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import twaver.Element;
import twaver.Layer;
import twaver.Link;
import twaver.MovableFilter;
import twaver.Node;
import twaver.ResizableNode;
import twaver.TDataBox;
import twaver.TWaverConst;
import twaver.TWaverUtil;
import twaver.network.CanvasCushion;
import twaver.network.TNetwork;

public class MainUI extends JFrame {

    public static final boolean DEBUG = false;
    private Font defaultFont = new Font("微软雅黑", Font.BOLD, 12);
    private TDataBox box = new TDataBox();
    private TNetwork network = new TNetwork(box);
    private Node control = new Node();
    private ResizableNode house = new ResizableNode() {

        @Override
        public void setLocation(Point2D.Double location) {
            super.setLocation(location);
            int altitude = (int) (Ground.getGroundHeight() - (location.y + this.getHeight() / 2));
            this.setName("海拔:" + altitude + "米");
        }
    };
    private JButton btnExit = new JButton("退出程序");
    private JButton btnAdd = new JButton("添加气球");
    private JButton btnCut = new JButton("剪断气球");

    public MainUI() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000, 850);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setTitle("Java飞屋环游记");
        TWaverUtil.centerWindow(this);
        this.setUndecorated(true);
        this.add(network, BorderLayout.CENTER);

        network.setToolbar(null);
        network.setBorder(null);
        network.getCanvasScrollPane().setBorder(null);
        network.getCanvasScrollPane().setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        network.getCanvasScrollPane().setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        final Image background = updateBackground();
        network.addCanvasCushion(new CanvasCushion() {

            public void paint(Graphics2D g) {
                Point pos = getLocationOnScreen();
                Point offset = new Point(-pos.x, -pos.y);
                g.drawImage(background, offset.x, offset.y, null);
            }
        });

        btnExit.setFont(new Font("微软雅黑", Font.BOLD, 12));
        network.getCanvas().add(btnExit);
        btnExit.setBounds(100, 100, 100, 30);
        btnExit.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        this.house.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                if (TWaverUtil.getPropertyName(evt).equalsIgnoreCase(TWaverConst.PROPERTYNAME_LOCATION)) {
                    int width = btnExit.getWidth();
                    int height = btnExit.getHeight();
                    //int x = house.getLocation().x + house.getWidth() / 2 - width / 2;
                    //int y = house.getLocation().y + house.getHeight();
                    int x = 950;
                    int y = 800;
                    btnExit.setBounds(x, y, width, height);
                }
            }
        });
        
        btnAdd.setFont(new Font("微软雅黑", Font.BOLD, 12));
        network.getCanvas().add(btnAdd);
        btnAdd.setBounds(100, 100, 100, 30);
        btnAdd.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
            	addMoreBalloons(1);
            }
        });
        this.house.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                if (TWaverUtil.getPropertyName(evt).equalsIgnoreCase(TWaverConst.PROPERTYNAME_LOCATION)) {
                    int width = btnAdd.getWidth();
                    int height = btnAdd.getHeight();
                    //int x = house.getLocation().x + house.getWidth() / 2 - width / 2;
                    //int y = house.getLocation().y + house.getHeight();
                    int x = 950;
                    int y = 700;
                    btnAdd.setBounds(x, y, width, height);
                }
            }
        });

        
        btnCut.setFont(new Font("微软雅黑", Font.BOLD, 12));
        network.getCanvas().add(btnCut);
        btnCut.setBounds(100, 100, 100, 30);
        btnCut.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
            	List list = box.getAllElements();
            	int size = list.size();
            	for(int i=0; i<size; i++)
            	{
            		if(list.get(i) instanceof BalloonLink)
            		{
            			BalloonLink bl = (BalloonLink)list.get(i);
            			//cutLink(bl, bl.getCenterLocation());
            			//cutLink(bl, bl.getLocation());
            			//cutLink(bl, new Point());
            			cutLink(bl, house.getLocation());
            			//bl.get
            			//bl.getLocation()

            		}
            	}
            	
            }
        });
        this.house.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                if (TWaverUtil.getPropertyName(evt).equalsIgnoreCase(TWaverConst.PROPERTYNAME_LOCATION)) {
                    int width = btnCut.getWidth();
                    int height = btnCut.getHeight();
                    //int x = house.getLocation().x + house.getWidth() / 2 - width / 2;
                    //int y = house.getLocation().y + house.getHeight();
                    int x = 950;
                    int y = 750;
                    btnCut.setBounds(x, y, width, height);
                }
            }
        });
        
        

        initComponents();
        createTopo();
        setupLayout();
        startMocker();
    }

    private Image updateBackground() {
        try {
            Robot robot = new Robot();
            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension dim = tk.getScreenSize();
            Rectangle bounds = new Rectangle(0, 0, (int) dim.getWidth(), (int) dim.getHeight());
            return robot.createScreenCapture(bounds);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    private void addMoreBalloons(int num) {
        for (int i = 0; i < num; i++) {
            Balloon balloon = new Balloon();
            balloon.setLocation(house.getCenterLocation());
            box.addElement(balloon);
            box.addElement(new BalloonLink(house, balloon));
            box.addElement(new InvisibleLink(control, balloon));
            box.moveToUp(house);
        }
    }

    private void initComponents() {
        network.addElementDoubleClickedActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == house) {
                    addMoreBalloons(10);
                }
            }
        });
        network.setToolbar(null);
        network.getCanvas().addMouseMotionListener(new MouseMotionAdapter() {

            private Link lastLink = null;

            @Override
            public void mouseMoved(MouseEvent e) {
                Element element = network.getElementPhysicalAt(e.getPoint());


                if (element instanceof BalloonLink) {
                    if (lastLink != null) {
                        lastLink.putLinkColor(BalloonLink.LINE_COLOR);
                    }
                    lastLink = (Link) element;
                    lastLink.putLinkColor(Color.darkGray);
                } else {
                    if (lastLink != null && element == null) {
                        lastLink.putLinkColor(BalloonLink.LINE_COLOR);
                    }
                }
            }
        });

        network.getCanvas().addMouseListener(new MouseAdapter() {

            @Override
            public void mouseReleased(MouseEvent e) {
                network.getSelectionModel().clearSelection();
            }

            @Override
            public void mousePressed(MouseEvent e) {
                Element element = network.getElementPhysicalAt(e.getPoint());
                if (element instanceof BalloonLink) {
                    final BalloonLink link = (BalloonLink) element;
                    cutLink(link, e.getPoint());
                }
            }
        });
    }

    private void cutLink(final BalloonLink link, Point cutPoint) {
        final Balloon balloon = (Balloon) link.getTo();
        final ResizableNode brokenPoint1 = new ResizableNode();
        final ResizableNode brokenPoint2 = new ResizableNode();

        //create a sky to raise balloon.
        final Sky sky = new Sky();
        sky.setLocation(balloon.getLocation().x, 0);
        box.addElement(sky);

        //remove old balloon link.
        box.removeElement(link);
        //remove old control link.
        box.removeElement((Link) balloon.getAllLinks().iterator().next());

        //add two sky links so balloon raise faster.
        final InvisibleLink skyLink1 = new InvisibleLink(sky, balloon);
        final InvisibleLink skyLink2 = new InvisibleLink(sky, balloon);
        final InvisibleLink skyLink3 = new InvisibleLink(sky, balloon);
        box.addElement(skyLink1);
        box.addElement(skyLink2);
        box.addElement(skyLink3);

        balloon.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                String propertyName = TWaverUtil.getPropertyName(evt);
                if (propertyName.equalsIgnoreCase(TWaverConst.PROPERTYNAME_LOCATION)) {
                    if (balloon.getY() < 100) {
                        box.removeElement(balloon);
                        box.removeElement(brokenPoint1);
                        box.removeElement(brokenPoint2);
                        box.removeElement(skyLink1);
                        box.removeElement(skyLink2);
                        box.removeElement(skyLink3);
                        box.removeElement(sky);
                    }
                }
            }
        });

        brokenPoint1.putCustomDraw(true);
        brokenPoint1.setSize(2, 2);
        brokenPoint1.putCustomDrawFill(false);
        brokenPoint1.putCustomDrawOutline(false);
        brokenPoint1.setCenterLocation(cutPoint);
        box.addElement(brokenPoint1);

        BrokenLink brokenLink = new BrokenLink(brokenPoint1, balloon);
        box.addElement(brokenLink);


        brokenPoint2.putCustomDraw(true);
        brokenPoint2.setSize(2, 2);
        brokenPoint2.putCustomDrawFill(false);
        brokenPoint2.putCustomDrawOutline(false);
        brokenPoint2.setCenterLocation(cutPoint);
        box.addElement(brokenPoint2);

        brokenLink = new BrokenLink(house, brokenPoint2);
        box.addElement(brokenLink);
    }

    private void setupLayout() {
        network.getSpringLayouter().setMovableFilter(new MovableFilter() {

            public boolean isMovable(Element element) {
                return element instanceof ResizableNode
                        && !(element instanceof Sky);
            }
        });
        //network.getSpringLayouter().setForceSize(0);
        network.getSpringLayouter().setStepSize(1);
        network.getSpringLayouter().setNodeRepulsionFactor(0.5);
        //network.getSpringLayouter().setLinkRepulsionFactor(1);
        network.getSpringLayouter().start();
    }

    private void createTopo() {
        control.setLocation(800, 10);
        control.setImage("/house/control.gif");
        control.putBorderVisible(false);
        control.setLayerID("control");
        control.setToolTipText("可以拖动我哦!");
        box.addElement(control);

        house.putLabelFont(defaultFont);
        house.putLabelColor(Color.white);
        house.putLabelBackground(TWaverUtil.getRandomAlphaColor());
        house.putLabelPosition(TWaverConst.POSITION_LEFT);
        house.setImage("/house/house.png");
        house.putBorderVisible(false);
        house.putLabelHighlightable(false);
        house.setLocation(500, 500);
        house.setLayerID("houes");
        house.setToolTipText("双击增加气球,还可以拖动房子!");
        box.addElement(house);

        Layer houseLayer = new Layer("house");
        box.getLayerModel().addLayer(houseLayer);
        box.getLayerModel().moveToTop(houseLayer);

        Layer balloonLayer = new Layer("balloon");
        box.getLayerModel().addLayer(balloonLayer);
        box.getLayerModel().moveToBottom(balloonLayer);

        Layer controlLayer = new Layer("control");
        box.getLayerModel().addLayer(controlLayer);
        box.getLayerModel().moveToBottom(controlLayer);

        //install some lines on ground.
        for (int i = 0; i < 100; i++) {
            Ground ground = new Ground();
            ground.setLocation(500, Ground.getGroundHeight());
            box.addElement(ground);
            box.addElement(new InvisibleLink(ground, house));
        }
    }

    private void startMocker() {
        Thread balloonThread = new Thread() {

            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                    for (int i = 0; i < 10; i++) {
                        Thread.sleep(500);
                        SwingUtilities.invokeLater(new Runnable() {

                            public void run() {
                                addMoreBalloons(10);
                            }
                        });
                    }
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        };
        balloonThread.start();
        Thread controlThread = new Thread() {

            @Override
            public void run() {
                final Hashtable map = new Hashtable();
                try {
                    while (true) {
                        Thread.sleep(10000);
                        Toolkit tk = Toolkit.getDefaultToolkit();
                        Dimension dim = tk.getScreenSize();
                        int x = TWaverUtil.getRandomInt(dim.width);
                        int y = TWaverUtil.getRandomInt(dim.height);
                        Point point = new Point(x, y);
                        map.put(control, point);
                        SwingUtilities.invokeLater(new Runnable() {

                            public void run() {
                                TWaverUtil.animateCenterLocation(map);
                            }
                        });
                    }
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        };
        controlThread.start();
    }

    public static void main(String[] args) {
        MainUI ui = new MainUI();
        ui.setVisible(true);
    }
}

2
3
分享到:
评论

相关推荐

    小清新飞屋环游记背景PPT模板.zip

    小清新飞屋环游记背景PPT模板是一个适合创作清新风格演示文稿的资源,它包含32张精心设计的幻灯片,旨在为观众带来一种轻松、自然的视觉体验,激发人们对未知世界的探索和梦想的追求。这个模板的灵感来源于动画电影...

    飞屋环游放飞梦想PPT模板.rar

    《飞屋环游放飞梦想PPT模板》是一款创意十足且设计精美的PPT模板,其主题灵感来源于经典的动画电影《飞屋环游记》,旨在为用户呈现出一种轻盈、梦幻的视觉效果,激发听众的无限想象。这款模板特别适合用于个人展示、...

    PPT模板-飞屋环游记PPT模板.dpt

    PPT模板-飞屋环游记PPT模板.dpt

    飞屋环游记背景的教育行业工作计划PPT模板.zip

    这是一套飞屋环游记背景的教育行业工作计划PPT模板,第一PPT模板网提供教育培训幻灯片模板免费下载; 关键词:蓝天白云、彩色气球、飞屋环游记PPT背景图片,动态教育培训幻灯片模板,新年工作计划PPT模板,蓝色红色...

    蓝天白云气球飞屋环游记PPT背景图片.zip

    《飞屋环游记》作为一部深受喜爱的动画电影,其中充满想象和浪漫色彩的气球与飞屋元素,搭配上清澈的蓝天白云,已成为了不少人梦想和探险的代名词。当这些元素被巧妙地应用到PPT背景图片中时,不仅能为演示文稿增添...

    飞屋环游记电影观后感大全.docx

    《飞屋环游记》这部动画电影自上映以来,便以它温暖人心的故事情节和丰富的主题寓意,赢得了世界各地观众的喜爱与认同。它不仅在技术层面,如3D视觉效果方面为观众带来了全新的观影体验,更在精神层面,对梦想、友谊...

    飞屋环游放飞梦想PPT模板.pptx

    所有的文字内容都可以根据实际需求进行替换,无论是标题还是详细描述,用户都能自由添加和修改,以适应各种汇报场景。同时,模版中的设计元素,如图表、图片和图形,都经过精心设计,确保了整体视觉效果的一致性和...

    英语电影飞屋环游记三人配音.docx

    《飞屋环游记》是一部由皮克斯动画工作室制作的英语电影,讲述了主角卡尔·弗雷德里克森与一个名叫罗素的小男孩的冒险故事。在这个过程中,他们遇到了一只名叫凯文的大鸟。电影通过对话展现了角色之间的互动以及探险...

    蓝天白云气球飞屋环游记PPT背景图片

    标题"蓝天白云气球飞屋环游记PPT背景图片"表明这组资源适用于创建与旅行、冒险或者梦幻氛围相关的PowerPoint演示文稿。这样的背景图片可以激发观众的想象力,为商务报告、教学材料或个人项目增添生动色彩。 首先,...

    小清新飞屋环游记背景PPT模板

    "小清新飞屋环游记背景PPT模板"就是这样一个设计精美的模板,适用于那些希望用创新和生动的方式来传达信息的人。这套模板以其独特的飞屋环游记主题,融合了清新自然风光,为观众带来一种逃离现实、追逐梦想的视觉...

    蓝天白云飞屋气球背景图片PPT模板

    "蓝天白云飞屋气球背景图片PPT模板"正是一款适合多种场合使用的背景资源,尤其对于那些需要展现轻松、愉快、自由氛围的演讲主题。这两张背景图片以蓝天白云为主题,融合了草地、绿叶、气球和飞屋等元素,呈现出一种...

    蓝天白云飞屋气球PPT背景图片

    5. **应用方法**:在PPT中添加背景图片,用户可以通过“设计”选项卡中的“背景样式”来更改背景,或者通过插入图片并设置其填充为幻灯片背景。此外,还可以自定义PPT模板,保存当前设计作为默认样式,以便在其他...

    蓝天白云气球飞屋环游记背景图片PPT模板

    最近,【蓝天白云气球飞屋环游记背景图片PPT模板】因其独特性和创造性脱颖而出,为用户提供了这样一个平台。 这款模板巧妙地将迪士尼皮克斯的经典动画电影《飞屋环游记》的主题融入PPT设计之中。《飞屋环游记》是一...

    飞屋环游记背景的教育行业工作计划PPT模板

    这是一套飞屋环游记背景的教育行业工作计划PPT模板,第一PPT模板网提供教育培训幻灯片模板免费下载; 关键词:蓝天白云、彩色气球、飞屋环游记PPT背景图片,动态教育培训幻灯片模板,新年工作计划PPT模板,蓝色红色...

    飞屋环游记背景的教育行业工作计划PPT模板.pptx

    【教育行业工作计划PPT模板】是用于教育领域工作规划的一种视觉呈现工具,结合了《飞屋环游记》这一知名动画电影的主题,为教育工作者提供了一种创新且吸引人的展示方式。以下将详细解析该模板的主要组成部分及其在...

    PS教程网期刊-第010期(修订版)

    这是从tataplay尖尖的“PS教程网-tata580”上整理出来的PS教程网期刊第10期(修订版),包含寂静丛林、木刻画制作、水墨山水画、外景写生、宝宝百日照、飞屋环游记、狙击神犬等30个教程或资源下载,有兴趣的朋友可以...

    英语电影演讲PPT课件.pptx

    这个PPT课件主题似乎与英语电影演讲有关,特别是围绕一部可能名为《飞屋环游记》(Up)的电影。这部电影是由皮克斯动画工作室制作,迪士尼发行的动画片,于2009年上映。从提供的内容来看,课件可能在讲述主角卡尔·...

    爱在远方.doc

    从给定文件中提取的关键知识点主要集中在两个方面:一是对动画电影《飞屋环游记》的推荐与解析,二是关于人际关系(特别是友情与家庭)的感悟。 ### 《飞屋环游记》推荐与解析 #### 1. 电影简介 - **主人公**:一...

Global site tag (gtag.js) - Google Analytics