锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码一区二区三区DV,中文字幕亚洲色图,精品亚洲视频在线观看http://www.tkk7.com/jiangshachina/category/33264.html鍚屾槸Java鐖卞ソ鑰咃紝鐩擱綍蹇呮浘鐩歌瘑錛?lt;br>    a cup of Java, cheers!zh-cnTue, 16 Jul 2013 07:40:36 GMTTue, 16 Jul 2013 07:40:36 GMT60Custom Layout Manager: PyramidLayout(鍘?http://www.tkk7.com/jiangshachina/archive/2012/07/15/383156.htmlSha JiangSha JiangSun, 15 Jul 2012 14:14:00 GMThttp://www.tkk7.com/jiangshachina/archive/2012/07/15/383156.htmlhttp://www.tkk7.com/jiangshachina/comments/383156.htmlhttp://www.tkk7.com/jiangshachina/archive/2012/07/15/383156.html#Feedback3http://www.tkk7.com/jiangshachina/comments/commentRss/383156.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/383156.html
Custom Layout Manager: PyramidLayout
    宸叉湁澶鍏充簬鑷畾涔夐儴灞綆$悊鍣ㄧ殑鏂囩珷浜嗐傛湰鏂囦粎鏄竴綃囧涔犵瑪璁幫紝鎻忚堪浜嗗浣曞疄鐜頒竴縐嶅儚鍫嗛噾瀛楀浼肩殑閮ㄥ眬綆$悊鍣紝寰堢畝鍗曪紝涔熸湁鐐瑰効鎰忔濓紝鍙兘浣犱篃浼氭劅鍏磋叮鐨勩?2012.07.17鏈鍚庢洿鏂?   

    I have developed Swing application for several years, although I'm not professional GUI developer, I'm shamed of never creating any custom layout manager. Maybe the existing Swing layout managers are too powerful to create new ones. At least, GridBagLayout is powerful enough for my real works. And we have much more flexible GroupLayout and SpringLayout, of course, both of them are too complex, in fact I never use them directly. However I indirectly take advantage of GroupLayout due to using NetBeans' GUI designer Matisse.

1. Layout Manager basics
    Let's start with some layout manager foundation. Before this time I learn to customize layout, I always think layout manager is very mysterious. Layout is like a magic player that put a variety of components to right positions in containers. I haven't browsed any code of any layout, event the simplest one. That's why I think layout is mystery. But it's simple for me now.
    Generally, all of layout implements one or both of LayoutManager and LayoutManager2 interfaces. LayoutManager2 is LayoutManager's sub-interface, then if someone implements LayoutManager2 that means it really implements LayoutManager. Mostly all modern layouts implements LayoutManager2.
    Interface LayoutManager defines the basic methods must be implemented by every layout, all of them are intuitional: add new component--addLayoutComponent(); remove component--removeLayoutComponent(); calculate preferred size--preferredLayoutSize(); calculate minimum size--minimumLayoutSize(); how to layout the components--layoutContainer(). Absolutely, the layoutContainer() method is essential, you must instruct the parent container how to allocate space(bounds) for every component.
    The extension interface LayoutManager2 introduces more methods that if you have to: support constraints--addLayoutComponent(Component, Object); specify maximum size--maximumLayoutSize(); specify alignment--getLayoutAlignmentX() and getLayoutAlignmentY(); destroy specific caches or reset some variables when invaliding container--invalidateLayout().

2. PyramidLayout
    Now let's feature a simple and funny layout manager--PyramidLayout. The layout allows container to add components like building a Pyramid, as shown as the image below,

    As the above, PyramidLayout puts the first component on the bottom, then puts the second on top of the first, but its bounds is smaller, ... It looks like a Pyramid, doesn't it? Here is the full codes,
public class PyramidLayout implements LayoutManager2 {

    
private List<Component> comps = new LinkedList<Component>();

    
public void addLayoutComponent(final Component comp,
            
final Object constraints) {
        
synchronized (comp.getTreeLock()) {
            comps.add(comp);
        }
    }

    
public void addLayoutComponent(final String name, final Component comp) {
        addLayoutComponent(comp, null);
    }

    
public void removeLayoutComponent(final Component comp) {
        
synchronized (comp.getTreeLock()) {
            comps.remove(comp);
        }
    }

    
public float getLayoutAlignmentX(final Container target) {
        
return 0.5F;
    }

    
public float getLayoutAlignmentY(final Container target) {
        
return 0.5F;
    }

    
public void invalidateLayout(final Container target) {
        System.out.println();
    }

    
public Dimension preferredLayoutSize(final Container parent) {
        
synchronized (parent.getTreeLock()) {
            Insets insets = parent.getInsets();
            
int width = insets.left + insets.right;
            
int height = insets.top + insets.bottom;
            
if (comps.size() == 0) {
                
return new Dimension(width, height);
            }

            Dimension size = comps.get(0).getPreferredSize();
            width += size.width;
            height += size.height;

            
return new Dimension(width, height);
        }
    }

    
public Dimension minimumLayoutSize(final Container parent) {
        
synchronized (parent.getTreeLock()) {
            Insets insets = parent.getInsets();
            
int width = insets.left + insets.right;
            
int height = insets.top + insets.bottom;
            
if (comps.size() == 0) {
                
return new Dimension(width, height);
            }

            Dimension size = comps.get(0).getMinimumSize();
            width += size.width;
            height += size.height;

            
return new Dimension(width, height);
        }
    }

    
public Dimension maximumLayoutSize(final Container target) {
        
return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
    }

    
public void layoutContainer(final Container parent) {
        
synchronized (parent.getTreeLock()) {
            Dimension parentSize = parent.getSize();
            
int compsCount = comps.size();
            Dimension step = new Dimension(parentSize.width / (2 * compsCount),
                    parentSize.height / (2 * compsCount));

            
for (int i = 0; i < compsCount; i++) {
                Component comp = comps.get(i);
                comp.setBounds(calcBounds(parentSize, step, i));
                parent.setComponentZOrder(comp, compsCount - i - 1);
            }
        }
    }

   
private Rectangle calcBounds(Dimension parentSize, Dimension step, int index) {
        
int x = step.width * index;
        
int y = step.height * index;
        
int width = parentSize.width - step.width * 2 * index;
        
int height = parentSize.height - step.height * 2 * index;
        
return new Rectangle(x, y, width, height);
    }
}
    Collection instance "comps" manages all of components, in this case, I take a LinkedList object to add and remove UI components. The layout doesn't concern any constraint, so the two addLayoutComponent() methods have the same actions. Please see the codes for details.
    As aforementioned, layoutContainer() method really takes charge of layouting the components. The key work is allocating space for each component, namely, specifying the bounds. Calculating bounds values just applies the simplest arithmetic operations.
    According to the intention, the bottom component fills the whole parent container, so it determines the preferred and the minimum sizes. For details, please take a look at methods preferredLayoutSize() and minimumLayoutSize(). Since the layout manager doesn't take care of the maximum size, the maximumLayoutSize() method simply returns a constant value.


Sha Jiang 2012-07-15 22:14 鍙戣〃璇勮
]]>
鏋勫緩涓嶈鍒欑獥浣?鍘?http://www.tkk7.com/jiangshachina/archive/2011/05/31/351369.htmlSha JiangSha JiangTue, 31 May 2011 12:46:00 GMThttp://www.tkk7.com/jiangshachina/archive/2011/05/31/351369.htmlhttp://www.tkk7.com/jiangshachina/comments/351369.htmlhttp://www.tkk7.com/jiangshachina/archive/2011/05/31/351369.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/351369.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/351369.html
鏋勫緩涓嶈鍒欑獥浣?/span>
鍦ㄥ紑鍙戜竴涓柊嫻井鍗歋wing瀹㈡埛绔殑榪囩▼涓笇鏈涜兘灞曠幇涓嶈鍒欑殑紿椾綋鐣岄潰錛屽師鏉?a >JDK 6 update 10鎻愪緵浜嗗垱寤烘寚瀹氬艦鐘剁獥浣撶殑鐗規э紝綆鍗曟槗鐢紝璁頒簬姝ゅ銆?2010.05.31鏈鍚庢洿鏂?

Java浠?a >JDK 6 update 10寮濮嬪皢鍐呭緩鏀寔鏋勫緩鎸囧畾褰㈢姸鐨勭獥浣擄紝綾籧om.sun.awt.AWTUtilities涓殑鏂規硶setWindowShape浼氭牴鎹笉鍚岀殑Shape瀹炵幇鍘繪瀯閫犵浉搴斿艦鐘剁殑紿椾綋銆侫WTUtilities綾繪槸鏀懼湪SUN鐨勫寘涓紝鍦ㄤ嬌鐢ㄨ鏂規硶鏃跺簲璇ラ氳繃鍙嶅皠鍘昏繘琛岃皟鐢紝濡備笅浠g爜鎵紺猴紝
Class<?> clazz = Class.forName("com.sun.awt.AWTUtilities");
Method method 
= clazz.getMethod("setWindowShape", Window.class, Shape.class);

1. 鍒涘緩姝e父紿椾綋
鍏堝垱寤轟竴涓畝鍗曠殑鐣岄潰錛屽畠浣跨敤BorderLayout錛屽湪鍏朵腑瀹夋斁5涓狫Button錛屽涓嬩唬鐮佹墍紺猴紝
public class ShapedFrame extends JFrame {

    
private static final long serialVersionUID = -2291343874280454383L;

    
private JButton centerButton = new JButton("Center");

    
public ShapedFrame() {
        
super("Shaped Frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initUI();
    }

    
private void initUI() {
        Container container 
= getContentPane();
        container.setLayout(
new BorderLayout());

        container.add(
new JButton("TOP"), BorderLayout.PAGE_START);
        container.add(
new JButton("RIGHT"), BorderLayout.LINE_END);
        container.add(
new JButton("BOTTOM"), BorderLayout.PAGE_END);
        container.add(
new JButton("LEFT"), BorderLayout.LINE_START);
        container.add(centerButton, BorderLayout.CENTER);
    }

    
public static void main(String[] args) {
        SwingUtilities.invokeLater(
new Runnable() {

            @Override
            
public void run() {
                ShapedFrame frame 
= new ShapedFrame();
                frame.setSize(
new Dimension(400300));
                frame.setUndecorated(
true);
                setAtCenter(frame);
                frame.setVisible(
true);
            }
        });
    }

    
// 灝哤indow緗簬灞忓箷姝d腑
    private static void setAtCenter(Window window) {
        Dimension screenSize 
= Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation((screenSize.width 
- window.getWidth()) / 2,
                (screenSize.height 
- window.getHeight()) / 2);
    }
}

鎵ц涓婅堪紼嬪簭鐨勬晥鏋滃涓嬪浘鎵紺猴紝


2. 鍒涘緩涓嶈鍒欑獥浣?
鍩轟簬涓婅堪紼嬪簭鍒涘緩涓嶈鍒欑獥浣擄紝浣挎暣涓獥浣撴濂界己澶辨帀RIGHT JButton鎵鍦ㄧ殑鍖哄煙錛屽涓嬩唬鐮佹墍紺猴紝
public class ShapedFrame extends JFrame {

    
private static final long serialVersionUID = -2291343874280454383L;

    
private static Method method = null;

    
static {
        
try {
            Class
<?> clazz = Class.forName("com.sun.awt.AWTUtilities");
            method 
= clazz.getMethod("setWindowShape", Window.class, Shape.class);
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }

    
private JButton centerButton = new JButton("Center");

    
public ShapedFrame() {
        
super("Shaped Frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initUI();
        addComponentListener(componentListener);
    }

    
private void initUI() {
        Container container 
= getContentPane();
        container.setLayout(
new BorderLayout());

        container.add(
new JButton("TOP"), BorderLayout.PAGE_START);
        container.add(
new JButton("RIGHT"), BorderLayout.LINE_END);
        container.add(
new JButton("BOTTOM"), BorderLayout.PAGE_END);
        container.add(
new JButton("LEFT"), BorderLayout.LINE_START);
        container.add(centerButton, BorderLayout.CENTER);
    }

    
private ComponentListener componentListener = new ComponentAdapter() {

        @Override
        
public void componentResized(ComponentEvent evt) { // 褰揢I緇勪歡(JFrame)鐨勫昂瀵稿彂鐢熸敼鍙樻椂錛岃皟鐢ㄨ鏂規硶
            Rectangle frameRect = getBounds();
            Rectangle spaceRect 
= centerButton.getBounds();

            Point o1 
= new Point(00);
            Point o2 
= new Point(frameRect.width, 0);
            Point o3 
= new Point(frameRect.width, frameRect.height);
            Point o4 
= new Point(0, frameRect.height);

            Point i1 
= new Point(spaceRect.x + spaceRect.width, spaceRect.y);
            Point i2 
= new Point(frameRect.width, spaceRect.y);
            Point i3 
= new Point(frameRect.width, spaceRect.y
                    
+ spaceRect.height);
            Point i4 
= new Point(spaceRect.x + spaceRect.width, spaceRect.y + spaceRect.height);

            
int[] xpoints = new int[] { o1.x, o2.x, i2.x, i1.x, i4.x, i3.x, o3.x, o4.x };
            
int[] ypoints = new int[] { o1.y, o2.y, i2.y, i1.y, i4.y, i3.y, o3.y, o4.y };
            
int npoints = 8
            
// 鏋勫緩涓涓叚杈瑰艦錛屽皢RIGHT JButton鎵澶勭殑浣嶇疆絀虹己鍑烘潵
            Shape shape = new Polygon(xpoints, ypoints, npoints);

            setWindowShape(ShapedFrame.
this, shape);
        }
    };

    
// 璁劇疆Window鐨勫艦鐘?/span>
    private static void setWindowShape(Window window, Shape shape) {
        
try {
            method.invoke(
null, window, shape);
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }

    
public static void main(String[] args) {
        SwingUtilities.invokeLater(
new Runnable() {

            @Override
            
public void run() {
                ShapedFrame frame 
= new ShapedFrame();
                frame.setSize(
new Dimension(400300));
                frame.setUndecorated(
true);
                setAtCenter(frame);
                frame.setVisible(
true);
            }
        });
    }

    
// 灝哤indow緗簬灞忓箷姝d腑
    private static void setAtCenter(Window window) {
        Dimension screenSize 
= Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation((screenSize.width 
- window.getWidth()) / 2,
                (screenSize.height 
- window.getHeight()) / 2);
    }
}

鎵ц涓婅堪紼嬪簭鍚庯紝浼氭湁濡備笅鍥炬墍紺虹殑鏁堟灉錛?br />



Sha Jiang 2011-05-31 20:46 鍙戣〃璇勮
]]>
浣犳墍涓嶇煡閬撶殑浜斾歡浜嬫儏--鏀硅繘Swing(璇?http://www.tkk7.com/jiangshachina/archive/2010/10/25/336125.htmlSha JiangSha JiangMon, 25 Oct 2010 14:23:00 GMThttp://www.tkk7.com/jiangshachina/archive/2010/10/25/336125.htmlhttp://www.tkk7.com/jiangshachina/comments/336125.htmlhttp://www.tkk7.com/jiangshachina/archive/2010/10/25/336125.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/336125.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/336125.html闃呰鍏ㄦ枃

Sha Jiang 2010-10-25 22:23 鍙戣〃璇勮
]]>
鏁版嵁鍔犺澆妯$硦榪涘害鎸囩ず闈㈡澘鐨勫疄鐜頒笌搴旂敤(鍘?http://www.tkk7.com/jiangshachina/archive/2009/11/29/304120.htmlSha JiangSha JiangSun, 29 Nov 2009 12:33:00 GMThttp://www.tkk7.com/jiangshachina/archive/2009/11/29/304120.htmlhttp://www.tkk7.com/jiangshachina/comments/304120.htmlhttp://www.tkk7.com/jiangshachina/archive/2009/11/29/304120.html#Feedback5http://www.tkk7.com/jiangshachina/comments/commentRss/304120.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/304120.html鏁版嵁鍔犺澆妯$硦榪涘害鎸囩ず闈㈡澘鐨勫疄鐜頒笌搴旂敤
褰撳湪鍔犺澆鏁版嵁(鎴栧叾瀹冭楁椂宸ヤ綔)鏃訛紝闇瑕佹樉紺轟竴涓繘搴︽寚紺洪潰鏉匡紝鏈枃浠嬬粛浜嗕竴縐嶇畝鏄撶殑瀹炵幇鏂瑰紡銆?2009.11.30鏈鍚庢洿鏂?

瀵逛簬璁稿Swing搴旂敤錛屽湪涓庣敤鎴風殑浜や簰榪囩▼涓彲鑳介渶瑕佷笌鏁版嵁搴撹繘琛岄氫俊(濡傦紝鍔犺澆鏁版嵁)銆傝岃繖涓繃紼嬪線寰姣旇緝鑰楁椂錛屼負浜嗕笉閫犳垚"鍋囨"鐜拌薄錛屼竴鑸兘浼氭樉紺轟竴涓ā緋婅繘搴︽寚紺哄櫒(涓嶄竴瀹氫嬌鐢?a >JProgressBar錛岀畝鍗曞湴鐢ㄤ竴涓浘鐗囦唬鏇垮嵆鍙?錛屽綋鏁版嵁鍔犺澆瀹屾瘯鍚庯紝璇ヨ繘搴︽寚紺哄櫒鑷姩娑堝け銆?br />     涓鑸湴錛岃妯$硦榪涘害鎸囩ず鍣ㄤ笉浼氬睍紺哄湪涓涓脊鍑虹殑瀵硅瘽妗嗕腑(鍥犱負榪欐牱涓嶇編瑙?錛岃屾槸鐩存帴鏄劇ず鍦ㄩ渶瑕佸睍紺鴻鍔犺澆鏁版嵁鐨勯潰鏉夸腑錛屽茍涓斿璇ラ潰鏉胯繘琛屾ā緋婂鐞嗐傚疄鐜拌繖涓鍔熻兘鐨勫叧閿氨鍦ㄤ簬錛屽湪灞忓箷鐨勫悓涓鍖哄煙鍐呭睍紺轟袱灞傞潰鏉匡細涓灞傛槸灞曠ず鏁版嵁鐨勯潰鏉匡紱鍙︿竴灞傛槸灞曠ず榪涘害鎸囩ず鍣ㄧ殑闈㈡澘銆傚綋鍔犺澆鏁版嵁鏃訛紝鏄劇ず榪涘害鎸囩ず鍣ㄩ潰鏉匡紝騫舵ā緋婃暟鎹潰鏉匡紱褰撴暟鎹姞杞藉畬姣曞悗錛岄殣钘忚繘搴︽寚紺哄櫒闈㈡澘錛屽茍浣挎暟鎹潰鏉挎竻鏅版樉紺恒備笅闈㈠皢浣跨敤org.jdesktop.swingx.StackLayout鏂瑰紡鏉ュ疄鐜頒笂榪板姛鑳姐?br />
1. LoadingPanel--鍔犺澆鎸囩ず鍣ㄩ潰鏉?/span>
    棣栧厛鍒涘緩涓涓姞杞芥寚紺哄櫒闈㈡澘銆傚鍓嶆墍榪幫紝鎴戜滑涓嶅繀浣跨敤鐪熸鐨勮繘搴︽潯浣滀負榪涘害鎸囩ず鍣紝浠呴渶瑕佷嬌鐢ㄤ竴寮犲姩鎬佸浘鐗囨潵浠f浛鍗沖彲銆侺oadingPanel鐨勫畬鏁翠唬鐮佸涓嬫墍紺猴紝
public class LoadingPanel extends JPanel {

    
private static final long serialVersionUID = 1962748329465603630L;

    
private String mesg = null;

    
public LoadingPanel(String mesg) {
        
this.mesg = mesg;
        initUI();
        interceptInput();
        setOpaque(
false);
        setVisible(
false);
    }

    
private void initUI() {
        JLabel label 
= new JLabel(mesg);
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setIcon(
new ImageIcon(getClass().getResource("/path/to/spinner.gif")));

        setLayout(
new BorderLayout());
        add(label, BorderLayout.CENTER);
    }

    
private void interceptInput() {
        addMouseListener(
new MouseAdapter() {});
        addMouseMotionListener(
new MouseMotionAdapter() {});
        addKeyListener(
new KeyAdapter() {});

        addComponentListener(
new ComponentAdapter() {
            @Override
            
public void componentShown(ComponentEvent e) {
                requestFocusInWindow();
            }
        });
        setFocusTraversalKeysEnabled(
false);
    }
}
涓婅堪浠g爜寰堝鏄撶悊瑙o紝LoadingPanel涓粎鏈変竴涓狫Label錛屽畠浼氬睍紺轟竴寮犲浘鐗?spinner.gif)鍙婁竴孌典俊鎭備絾鏈変袱孌典唬鐮侀渶瑕佺壒鍒鏄庯細
[1]鏋勯犲櫒涓殑涓よ浠g爜

setVisible(false);
setOpaque(
false);
LoadingPanel鍙湪鍔犺澆鏁版嵁鏃舵墠鏄劇ず錛屽叾瀹冩椂鍊欐槸涓嶆樉紺虹殑錛屾墍浠ュ畠榛樿涓嶅彲瑙併傚彟澶栵紝鍦ㄦ樉紺篖oadingPanel鐨勫悓鏃訛紝鎴戜滑浠嶇劧甯屾湜鑳界湅鍒版暟鎹潰鏉匡紝鎵浠oadingPanel搴旇鏄忔槑鐨勩?br /> [2]interceptInput鏂規硶
褰揕oadingPanel鏄劇ず涔嬪悗錛屾垜浠笉甯屾湜鐢ㄦ埛榪樿兘澶熸搷浣滄暟鎹潰鏉匡紝閭d箞灝遍渶瑕佸睆钄芥帀鐢ㄦ埛(榧犳爣錛岄敭鐩?杈撳叆銆?br />
addMouseListener(new MouseAdapter() {});
addMouseMotionListener(
new MouseMotionAdapter() {});
addKeyListener(
new KeyAdapter() {});
涓婅堪涓夎浠g爜灝變嬌寰桳oadingPanel鑳芥崟鑾鋒墍鏈夌殑榧犳爣涓庨敭鐩樹簨浠訛紝騫跺拷鐣ユ帀瀹冧滑銆備絾浠呬粎濡傛榪樹笉澶燂紝鍦ㄥ睍紺篖oadingPanel鏃訛紝鏁版嵁闈㈡澘涓殑鏌愪釜UI緇勪歡寰堝彲鑳藉凡緇忚幏寰楃劍鐐逛簡錛岄偅涔堢敤鎴蜂粛鐒跺彲浠ラ氳繃閿洏鎿嶆帶鏁版嵁闈㈡澘涓殑緇勪歡(鍥犱負緋葷粺浼氭妸閿洏浜嬩歡鍙戦佺粰褰撳墠鑾峰彇鐒︾偣鐨勭粍浠?銆傝屼笖錛屽嵆浣挎暟鎹潰鏉夸腑娌℃湁浠諱綍緇勪歡鑾峰緱鐒︾偣錛岀敤鎴蜂粛鐒跺彲浠ラ氳繃Tab閿妸鐒︾偣杞Щ鍒版暟鎹潰鏉夸腑鐨勭粍浠朵笂銆備負浜嗛樆姝㈣繖涓鎿嶄綔錛岃繕闇瑕佸姞涓婂涓嬪嚑琛屼唬鐮侊紝
addComponentListener(new ComponentAdapter() { // 涓鏃oadingPanel鍙錛屽嵆鑾峰彇鐒︾偣
    @Override
    
public void componentShown(ComponentEvent e) {
        requestFocusInWindow();
    }
});
setFocusTraversalKeysEnabled(
false); // 闃繪鐢ㄦ埛杞Щ鐒︾偣

2. 紺轟緥紼嬪簭

    鍦ㄦ澶勭殑紺轟緥紼嬪簭涓紝鏁版嵁闈㈡澘(dataPanel)涓粎鏈変竴涓寜閽紝褰撶偣鍑昏鎸夐挳鏃朵細鏄劇ずloadingPanel錛屼笖妯$硦鎺塪ataPanel錛屽茍浼氬惎鍔ㄤ竴涓柊鐨勭嚎紼嬶紝璇ョ嚎紼嬩細鍦ㄧ潯鐪犲ぇ綰?縐?妯℃嫙鑰楁椂鐨勬暟鎹姞杞藉伐浣?涔嬪悗闅愯棌loadingPanel錛屼笖浣縟ataPanel閲嶆柊娓呮櫚鍙銆?br />     鍊煎緱娉ㄦ剰鐨勬槸錛岃紺轟緥紼嬪簭浣跨敤浜?a >SwingX涓殑涓や釜緇勪歡錛?a >JXPanel鍜?a >StackLayout銆侸XPanel鎻愪緵浜嗕竴涓柟娉?setAlpha)浠ユ柟渚垮湴璁劇疆Panel鐨勯忔槑搴?Alpha鍊?錛涜孲tackLayout鍏佽鍦ㄥ悓涓鍧楀尯鍩熷唴娣誨姞澶氬眰緇勪歡錛屽茍鑳藉悓鏃跺睍紺烘墍鏈夊眰鐨勭粍浠?鑰岋紝CardLayout涓嬈″彧鑳芥樉紺烘煇涓灞傜殑緇勪歡)銆傚畬鏁寸殑紺轟緥紼嬪簭濡備笅鎵紺猴紝
public class LoadDataDemo extends JFrame {

    
private static final long serialVersionUID = 5927602404779391420L;

    
private JXPanel dataPanel = null// 浣跨敤org.jdesktop.swingx.JXPanel錛屼互鏂逛究璁劇疆娓呮櫚搴?/span>

    
private LoadingPanel loadingPanel = null;

    
public LoadDataDemo() {
        
super("LoadData Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initUI();
    }

    
private void initUI() {
        JButton button 
= new JButton("Load Data");
        button.addActionListener(handler);
        dataPanel 
= new JXPanel(new FlowLayout(FlowLayout.CENTER));
        dataPanel.add(button);

        loadingPanel 
= new LoadingPanel("Loading");

        
// 浣跨敤org.jdesktop.swingx.StackLayout錛屽皢loadingPanel緗簬dataPanel鐨勪笂鏂?/span>
        JPanel centerPanel = new JXPanel(new StackLayout());
        centerPanel.add(dataPanel, StackLayout.TOP);
        centerPanel.add(loadingPanel, StackLayout.TOP);

        Container container 
= getContentPane();
        container.setLayout(
new BorderLayout());
        container.add(centerPanel, BorderLayout.CENTER);
    }

    
transient private ActionListener handler = new ActionListener() {

        
public void actionPerformed(ActionEvent e) {
           
// 灝哾ataPanel鍙婂叾瀛愮粍浠剁殑娓呮櫚搴﹁緗負50%錛涘茍鏄劇ずloadingPanel
            dataPanel.setAlpha(0.5F);
            loadingPanel.setVisible(
true);

            Thread thread 
= new Thread() {
                
public void run() {
                    
try {
                        Thread.sleep(
3000L); // 鐫$湢綰?縐掗挓錛屼互妯℃嫙鍔犺澆鏁版嵁鐨勮繃紼?/span>
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                   
// 鏁版嵁鍔犺澆瀹屾瘯鍚庯紝閲嶆柊闅愯棌loadingPanel錛涘茍浣縟ataPanel鍙婂叾瀛愮粍浠墮噸鏂版竻鏅板彲瑙?/span>
                    loadingPanel.setVisible(false);
                    dataPanel.setAlpha(1F);
                };
            };
            thread.start();
        }
    };

    
public static void main(String[] args) {
        LoadDataDemo demo 
= new LoadDataDemo();
        demo.setSize(
new Dimension(400300));
        demo.setVisible(
true);
    }
}

3. 涓嶄嬌鐢⊿wingX

    SwingX涓烘垜浠彁渚涗簡涓緋誨垪鍔熻兘寮哄ぇ錛屼嬌鐢ㄧ畝鏄撶殑Swing鎵╁睍緇勪歡錛屾垜寮虹儓寤鴻浣犲幓浣跨敤瀹冦備絾鑻ュ洜鏁咃紝浣犱笉鍑嗗浣跨敤瀹冩椂錛屾垜浠粛鐒舵湁鏇夸唬鐨勮В鍐蟲柟妗堬紝浣嗘澶勪粎綆榪頒竴浜屻?br /> [1]瀵逛簬璁劇疆Alpha鍊鹼紝闇瑕佸垱寤轟竴涓戶鎵胯嚜JPanel鐨凞ataPanel綾伙紝瑕嗗啓paintComponent鏂規硶錛屽湪鍏朵腑浣跨敤Alpha鍚堟垚錛?br />
Graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
[2]瀵逛簬StackLayout錛屾垜浠彲浠ヤ嬌鐢℅lassPane(鐜葷拑紿楁牸)鎴朙ayeredPane(鍒嗗眰紿楁牸)榪涜鏇挎崲錛屽皢LoadingPanel璁劇疆涓篏lassPane鎴朙ayeredPanel涓殑涓灞傘傜敱浜庝竴涓狫Frame鍙湁涓涓狦lassPane錛屼負浜嗙▼搴忕殑鐏墊椿鎬э紝涓鑸閫変嬌鐢↙ayeredPane銆?br />


Sha Jiang 2009-11-29 20:33 鍙戣〃璇勮
]]>
鍒╃敤SwingX涓嶵imingFramework瀹炵幇娣″叆娣″嚭(鍘?http://www.tkk7.com/jiangshachina/archive/2009/09/28/296709.htmlSha JiangSha JiangMon, 28 Sep 2009 01:46:00 GMThttp://www.tkk7.com/jiangshachina/archive/2009/09/28/296709.htmlhttp://www.tkk7.com/jiangshachina/comments/296709.htmlhttp://www.tkk7.com/jiangshachina/archive/2009/09/28/296709.html#Feedback0http://www.tkk7.com/jiangshachina/comments/commentRss/296709.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/296709.html鍒╃敤SwingX涓嶵imingFramework瀹炵幇娣″叆娣″嚭
鏈枃浣跨敤SwingX涓?a >TimingFramework灞曠ず浜嗗浣曞疄鐜版貳鍏ユ貳鍑烘晥鏋滐紝紼嬪簭綆媧佸疄鐢紝甯屾湜瀵瑰ぇ瀹惰兘鏈夋墍鍔╃泭銆?2009.09.28鏈鍚庢洿鏂?

鍦⊿wing涓嬌鐢?a >AlphaComposite璁劇疆鐣岄潰鐨勫崐閫忔槑搴︼紝鍐嶉厤鍚?a >javax.swing.Timer鍙互姣旇緝瀹規槗鍦板疄鐜版貳鍏ユ貳鍑烘晥鏋溿備絾闇瑕佹垜浠戶鎵垮叿浣撶殑UI緇勪歡錛屽茍閲嶅啓瀹冪殑paintComponent鏂規硶錛屽悓鏃惰繕瑕佷負Timer鎻愪緵涓涓狝ctionListener鐨勫疄鐜般傝繖浜涘浜庣▼搴忓憳鏉ヨ錛屾樉寰楁湁浜涗箯鍛熾?br />     騫歌繍鍦版槸錛孲wingX涓殑JXPanel(JPanel鐨勫瓙綾?閫氳繃setAlpha鏂規硶鏉ヨ緗崐閫忔槑搴︼紝JXPanel涓殑鎵鏈塙I緇勪歡閮藉彲闅忎箣鍗婇忔槑鍖栥俆imingFramework鎻愪緵鐨凙nimator鍙互甯姪鎴戜滑闈炵嚎鎬у湴璁劇疆JXPanel涓殑alpha鍊箋傛晠錛屾垜浠湪瀹炵幇娣″叆娣″嚭鏃訛紝鍙互浣跨敤JXPanel鏉ユ浛浠Panel錛岀敤Animator鏉ユ浛浠imer銆?br />

    涓嬮潰鏄竴涓潪甯哥畝鍗曠殑紺轟緥錛岃紺轟緥鍦ㄤ竴涓嬌鐢–ardLayout鐨凧Panel--cardPanel錛屼腑鍙﹀寘鍚簡涓や釜JXPanel--panelA鍜宲anelB錛岃繖涓や釜瀛愬鍣ㄤ腑鍙堝垎鍒湁涓涓狫Button--buttonA鍜宐uttonB銆傚綋鐐瑰嚮buttonA鏃訛紝灝嗘貳鍏ユ樉紺簆anelB錛涘綋鐐瑰嚮buttonB鏃訛紝灝嗘貳鍏ユ樉紺簆anelA銆?br />
 1 public class FadingCardDemo extends JFrame {
 2 
 3     private static final long serialVersionUID = 8005909309849021746L;
 4 
 5     private String CARD_A = "CARD_A";
 6     private String CARD_B = "CARD_B";
 7 
 8     private JPanel cardPanel = null;
 9     private JXPanel panelA = null;
10     private JXPanel panelB = null;
11     private JButton buttonA = null;
12     private JButton buttonB = null;
13 
14     public FadingCardDemo() {
15         super("FadingButton Demo");
16         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
17         initUI();
18     }
19 
20     private void initUI() {
21         cardPanel = new JPanel(new CardLayout());
22 
23         buttonA = new JButton("Button A");
24         buttonA.addActionListener(actionHandler);
25         panelA = new JXPanel(new BorderLayout());
26         panelA.add(buttonA, BorderLayout.CENTER);
27         cardPanel.add(panelA, CARD_A);
28 
29         buttonB = new JButton("Button B");
30         buttonB.addActionListener(actionHandler);
31         panelB = new JXPanel(new BorderLayout());
32         panelB.add(buttonB, BorderLayout.CENTER);
33         cardPanel.add(panelB, CARD_B);
34 
35         Container container = getContentPane();
36         container.setLayout(new BorderLayout());
37         container.add(cardPanel, BorderLayout.CENTER);
38     }
39 
40     private ActionListener actionHandler = new ActionListener() {
41 
42         private Animator animator = null;
43 
44         public void actionPerformed(ActionEvent e) {
45             if (animator == null) {
46                 animator = new Animator(2000);
47                 animator.setDeceleration(0.2F);
48                 animator.setAcceleration(0.4F);
49             } else if (animator.isRunning()) {
50                 animator.stop();
51             }
52 
53             JButton button = (JButton) e.getSource();
54             if (button == buttonA) {
55                 animator.addTarget(new PropertySetter(panelB, "alpha"1.0F));
56                 panelB.setAlpha(0.1F);
57                 ((CardLayout) cardPanel.getLayout()).show(cardPanel, CARD_B);
58             } else if (button == buttonB) {
59                 animator.addTarget(new PropertySetter(panelA, "alpha"1.0F));
60                 panelA.setAlpha(0.1F);
61                 ((CardLayout) cardPanel.getLayout()).show(cardPanel, CARD_A);
62             }
63             animator.start();
64         }
65     };
66 
67     public static void main(String[] args) {
68         SwingUtilities.invokeLater(new Runnable() {
69             public void run() {
70                 FadingCardDemo demo = new FadingCardDemo();
71                 demo.setSize(new Dimension(400300));
72                 demo.setVisible(true);
73             }
74         });
75     }
76 }


Sha Jiang 2009-09-28 09:46 鍙戣〃璇勮
]]>
涓涓畝鍗曠殑CheckBox Tree瀹炵幇(鍘?http://www.tkk7.com/jiangshachina/archive/2009/08/05/289996.htmlSha JiangSha JiangWed, 05 Aug 2009 13:10:00 GMThttp://www.tkk7.com/jiangshachina/archive/2009/08/05/289996.htmlhttp://www.tkk7.com/jiangshachina/comments/289996.htmlhttp://www.tkk7.com/jiangshachina/archive/2009/08/05/289996.html#Feedback3http://www.tkk7.com/jiangshachina/comments/commentRss/289996.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/289996.html涓涓畝鍗曠殑CheckBox Tree瀹炵幇
CheckBox Tree鏄竴涓崄鍒嗗父鐢ㄧ殑UI緇勪歡錛屽畠鑳戒嬌鐢ㄦ埛鏂逛究鍦版寜鐗瑰畾瑙勫垯鍕鵑夋爲涓殑鑺傜偣銆?/span>鏈枃瀹炵幇浜嗕竴縐嶇畝鍗曠殑Checking瑙勫垯錛氬綋鍕鵑変簡鏌愯妭鐐瑰悗錛岃鑺傜偣鐨勬墍鏈変笅綰ц妭鐐瑰叏閮ㄨ鍕鵑夛紱褰撳彇娑堝嬀閫夋煇鑺傜偣鍚庯紝璇ヨ妭鐐圭殑鎵鏈変笅綰ц妭鐐瑰叏閮ㄨ鍙栨秷鍕鵑夈?2009.08.05鏈鍚庢洿鏂?

瀹炵幇CheckBox Tree鐨勫父鐢ㄦ柟娉曪紝灝辨槸浣跨敤JCheckBox浣滀負JTree鐨凾reeCellRendrer錛屽茍涓旈渶瑕佸疄鐜扮壒瀹氱殑Checking瑙勫垯鏉ュ嬀閫?鍙栨秷鍕鵑塁heckBox銆?br />
1. 鏍戣妭鐐?/span>
DefaultMutableTreeNode鏄渶甯哥敤鐨凾reeNode瀹炵幇錛屾澶勬垜浠皢鎵╁睍榪欎竴瀹炵幇--CheckBoxTreeNode錛屽鍔犱竴涓睘鎬?span style="color: #2000ff;">isChecked
錛岀敤浜庢爣璇嗚鑺傜偣鏄惁瑕佽鍕鵑変笂銆傝綾葷殑瀹屾暣浠g爜濡備笅鎵紺猴細
public class CheckBoxTreeNode extends DefaultMutableTreeNode {

       
private static final long serialVersionUID = 3195314943599939279L;

       
private boolean isChecked = false;

       
public CheckBoxTreeNode(Object userObject) {
               
super(userObject);
       }

       
public boolean isChecked() {
               
return isChecked;
       }

       
public void setChecked(boolean isChecked) {
               
this.isChecked = isChecked;
       }
}

2. 娓叉煋鍣?/span>
濡傛湰鏂囧紑澶存墍榪幫紝鎴戜滑灝嗕嬌鐢↗CheckBox浣滀負鏍戣妭鐐瑰睍鐜板艦寮忕殑娓叉煋鍣紝鍚屾椂紜畾瀵硅妭鐐硅繘琛屽嬀閫夋垨鍙栨秷鍕鵑夌殑瑙勫垯銆侰heckBoxTreeCellRenderer鏈韓鍗蟲槸涓涓狫CheckBox錛岄偅涔堝湪瀹炵幇getTreeCellRendererComponent鏂規硶鏃訛紝鍙畝鍗曞湴榪斿洖瀹冭嚜宸辯殑瀹炰緥鍗沖彲錛岃屽浜庡嬀閫夋垨鍙栨秷鍕鵑夌殑鏉′歡錛屽垯鐢盋heckBoxTreeNode涓殑isChecked灞炴ф潵紜畾錛屽畬鏁寸殑浠g爜濡備笅鎵紺猴細
public class CheckBoxTreeCellRenderer extends JCheckBox implements TreeCellRenderer {

       
private static final long serialVersionUID = -6432020851855339311L;

       
public CheckBoxTreeCellRenderer() {
               setOpaque(
false);
       }

       
public Component getTreeCellRendererComponent(JTree tree, Object value,
                       
boolean selected, boolean expanded, boolean leaf, int row,
                       
boolean hasFocus) {
               CheckBoxTreeNode node 
= ((CheckBoxTreeNode) value); // 鑾峰彇鏍戣妭鐐瑰璞°?/span>
               setText(node.toString()); // 璁劇疆CheckBox鎵灞曠ず鐨勬枃鏈?br />
               
// 褰撴爲鑺傜偣琚緗負鍕鵑夋椂錛屽垯璇ヨ妭鐐瑰搴旂殑CheckBox琚嬀閫変笂錛涘惁鍒欙紝鍙栨秷鍕鵑夈?/span>
               if (node.isChecked()) {
                       setSelected(
true);
                       setForeground(Color.BLUE);
               } 
else {
                       setSelected(
false);
                       setForeground(tree.getForeground());
               }
               
return this;
       }
}

3. 鏍?/span>
姝ゅ瀵笿Tree榪涜鎵╁睍錛屽垱寤篊heckBoxTree錛岃綾誨彧鏄負JTree娣誨姞浜嗕竴涓狹ouseListener錛屼互渚﹀惉榧犳爣閫変腑鏍戣妭鐐瑰悗錛屽浣曡緗嬀閫夋爣璁幫紝騫墮噸緇樻爲銆?br />
public class CheckBoxTree extends JTree {

       
private static final long serialVersionUID = -217950037507321241L;

       
public CheckBoxTree(TreeModel newModel) {
               
super(newModel);
               addCheckingListener();
       }

       
private void addCheckingListener() {
               addMouseListener(
new MouseAdapter() {

                       @Override
                       
public void mousePressed(MouseEvent e) {
                               
int row = getRowForLocation(e.getX(), e.getY());
                               TreePath treePath 
= getPathForRow(row);
                               
if (treePath == null) {
                                       
return;
                               }

                               CheckBoxTreeNode node 
= ((CheckBoxTreeNode) treePath.getLastPathComponent());
                               
boolean checking = !node.isChecked(); // 濡傛灉璇ヨ妭鐐瑰凡琚嬀閫変笂錛屽垯姝ゆ灝嗗彇娑堝嬀閫夛紱鍙嶄箣錛屼害鍙嶃?/span>
                               checkNode(node, checking);

                               repaint(); 
// 閲嶇粯鏁存5鏍戙?/span>
                       }

                       
// 閫掑綊鍦板嬀閫夋垨鍙栨秷鍕鵑夋寚瀹氳妭鐐瑰強鍏舵墍鏈変笅綰ц妭鐐圭殑CheckBox銆?/span>
                       private void checkNode(CheckBoxTreeNode node, boolean checking) {
                               node.setChecked(checking);
                               
if (!node.isLeaf()) {
                                       Enumeration
<CheckBoxTreeNode> children = node.children();
                                       
while (children.hasMoreElements()) {
                                               checkNode(children.nextElement(), checking);
                                       }
                               }
                       }
               });
       }
}
涓婅堪紼嬪簭鏈変袱涓叧閿偣錛?. 璁劇疆褰撳墠鑺傜偣鍙婂叾瀛愯妭鐐圭殑鍕鵑夋爣璁?-checkNode錛?. 閲嶇粯鏍?-repaint銆傝皟鐢╮epaint鏂規硶瀵規爲榪涜緇樺埗鏃訛紝鏂規硶TreeCellRenderer.getTreeCellRendererComponent灝變細琚皟鐢紝姝ゆ椂紼嬪簭灝變細鏍規嵁checkNode鏂規硶璁懼畾鐨?span style="color: #2000ff;">isChecked鏉ュ嬀閫夋垨鍙栨秷鍕鵑夊搴旂殑鏍戣妭鐐笴heckBox銆傜畝璦涔嬶紝灝辨槸鍏堣緗爲鍨嬫暟鎹腑鐨勫嬀閫夋爣璁幫紝鐒跺悗娓叉煋鍣ㄥ啀鏍規嵁榪欎簺鏍囪鏉ユ覆鏌揅heckBox銆?br />

Sha Jiang 2009-08-05 21:10 鍙戣〃璇勮
]]>
鍒ゅ畾涓涓偣鏄惁鍦ㄤ笁瑙掑艦鍐?鍘?http://www.tkk7.com/jiangshachina/archive/2008/07/24/217214.htmlSha JiangSha JiangThu, 24 Jul 2008 09:02:00 GMThttp://www.tkk7.com/jiangshachina/archive/2008/07/24/217214.htmlhttp://www.tkk7.com/jiangshachina/comments/217214.htmlhttp://www.tkk7.com/jiangshachina/archive/2008/07/24/217214.html#Feedback13http://www.tkk7.com/jiangshachina/comments/commentRss/217214.htmlhttp://www.tkk7.com/jiangshachina/services/trackbacks/217214.html鍒ゅ畾涓涓偣鏄惁鍦ㄤ笁瑙掑艦鍐?/span>
濡備綍鍒ゅ畾涓涓偣P鏄惁瀛樺湪浜庢寚瀹氱殑涓夎褰BC鍐咃紝榪欒偗瀹氭槸涓涓畝鍗曠殑闂錛屾湰鏂囦粎鐢ㄤ竴涓浘褰㈢晫闈㈢▼搴忓睍紺轟簡璇ラ棶棰橈紝鏈夊叴瓚g殑鏈嬪弸鍙互鐪嬬湅銆?2008.07.24鏈鍚庢洿鏂?

鍦ㄦ澶勪嬌鐢ㄤ竴縐嶅父瑙佷笖綆渚跨殑鏂規硶錛?strong>濡傛灉涓夎褰AB錛孭AC鍜孭BC鐨勯潰縐箣鍜屼笌涓夎褰BC鐨勯潰縐浉絳夛紝鍗沖彲鍒ゅ畾鐐筆鍦ㄤ笁瑙掑艦ABC鍐?鍖呮嫭鍦ㄤ笁鏉¤竟涓?銆?br /> 鍙煡錛岃鏂規硶鐨勫叧閿湪浜庡浣曡綆椾笁瑙掑艦鐨勯潰縐傚垢榪愬湴鏄紝褰撶煡閬撲笁瑙掑艦欏剁偣(A錛孊鍜孋)鐨勫潗鏍?(Ax, Ay)錛?Bx, By)鍜?Cx, Cy))涔嬪悗錛屽嵆鍙綆楀嚭鍏墮潰縐細
= |(Ax * By + Bx * Cy + Cx * Zy - Ay * Bx - By * Cx - Cy * Ax) / 2|

鍏抽敭鐨勪唬鐮佸涓嬶紝
// 鐢辯粰瀹氱殑涓変釜欏剁偣鐨勫潗鏍囷紝璁$畻涓夎褰㈤潰縐?br /> // Point(java.awt.Point)浠h〃鐐圭殑鍧愭爣銆?/span>
private static double triangleArea(Point pos1, Point pos2, Point pos3) {
    
double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y
            
- pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D);
    
return result;
}

// 鍒ゆ柇鐐筽os鏄惁鍦ㄦ寚瀹氱殑涓夎褰㈠唴銆?/span>
private static boolean inTriangle(Point pos, Point posA, Point posB,
        Point posC) {
    
double triangleArea = triangleArea(posA, posB, posC);
    
double area = triangleArea(pos, posA, posB);
    area 
+= triangleArea(pos, posA, posC);
    area 
+= triangleArea(pos, posB, posC);
    
double epsilon = 0.0001;  // 鐢變簬嫻偣鏁扮殑璁$畻瀛樺湪鐫璇樊錛屾晠鎸囧畾涓涓凍澶熷皬鐨勬暟錛岀敤浜庡垽瀹氫袱涓潰縐槸鍚?榪戜技)鐩哥瓑銆?/span>
    if (Math.abs(triangleArea - area) < epsilon) {
        
return true;
    }
    
return false;
}

鎵ц璇ュ簲鐢ㄧ▼搴忥紝鐢ㄩ紶鏍囧湪鍏朵腑鐐瑰嚮涓夋錛屽嵆鍙粯鍒朵竴涓笁瑙掑艦錛屽涓嬬粍鍥炬墍紺猴細

鐒跺悗浠呴渶縐誨姩榧犳爣錛屽氨浼氬嚭鐜頒竴涓┖蹇冨渾鍦堛傚鏋滃渾鍦堢殑涓績鍦ㄤ笁瑙掑唴(鍖呭惈鍦ㄤ笁鏉¤竟涓?錛屽垯鍦嗗湀鏄劇ず涓虹孩鑹詫紱鍚﹀垯錛屾樉紺轟負钃濊壊銆傚涓嬬粍鍥炬墍紺猴細


瀹屾暣浠g爜濡備笅錛?br />
public class CanvasPanel extends JPanel {

    
private static final long serialVersionUID = -6665936180725885346L;

    
private Point firstPoint = null;

    
private Point secondPoint = null;

    
private Point thirdPoint = null;

    
public CanvasPanel() {
        setBackground(Color.WHITE);
        addMouseListener(mouseAdapter);
        addMouseMotionListener(mouseAdapter);
    }

    
public void paintComponent(Graphics g) {
        
super.paintComponent(g);
        drawTriangel(g);
    }

    
private void drawTriangel(Graphics g) {
        
if (firstPoint != null && secondPoint != null) {
            g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
            
if (thirdPoint != null) {
                g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y);
                g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y);
            }
        }
    }

    
private static boolean inTriangle(Point pos, Point posA, Point posB,
            Point posC) {
        
double triangeArea = triangleArea(posA, posB, posC);
        
double area = triangleArea(pos, posA, posB);
        area 
+= triangleArea(pos, posA, posC);
        area 
+= triangleArea(pos, posB, posC);
        
double epsilon = 0.0001;
        
if (Math.abs(triangeArea - area) < epsilon) {
            
return true;
        }
        
return false;
    }

    
private static double triangleArea(Point pos1, Point pos2, Point pos3) {
        
double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y
                           
- pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D);
        
return result;
    }

    
private MouseInputAdapter mouseAdapter = new MouseInputAdapter() {

        
public void mouseReleased(MouseEvent e) {
            Point pos 
= e.getPoint();
            
if (firstPoint == null) {
                firstPoint 
= pos;
            } 
else if (secondPoint == null) {
                secondPoint 
= pos;
                Graphics g 
= CanvasPanel.this.getGraphics();
                CanvasPanel.
this.paintComponent(g);
                g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
            } 
else if (thirdPoint == null) {
                thirdPoint 
= pos;
                Graphics g 
= CanvasPanel.this.getGraphics();
                CanvasPanel.
this.paintComponent(g);
                g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
                g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y);
                g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y);
            }
        }

        
public void mouseMoved(MouseEvent e) {
            Point pos 
= e.getPoint();
            Graphics2D g2 
= (Graphics2D) CanvasPanel.this.getGraphics();
            CanvasPanel.
this.paintComponent(g2);
            
if (firstPoint != null && secondPoint == null) {
                g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y);
            } 
else if (firstPoint != null && secondPoint != null && thirdPoint == null) {
                g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y);
                g2.drawLine(secondPoint.x, secondPoint.y, pos.x, pos.y);
            } 
else if (firstPoint != null && secondPoint != null && thirdPoint != null) {
                
if (inTriangle(pos, firstPoint, secondPoint, thirdPoint)) {
                    g2.setColor(Color.RED);
                } 
else {
                    g2.setColor(Color.BLUE);
                }
                
int radius = 4;
                g2.drawOval(pos.x 
- radius, pos.y - radius, radius * 2, radius * 2);
            }
        }
    };
}

public class Triangle extends JFrame {

    
private static final long serialVersionUID = 1L;

    
private CanvasPanel mainPanel = null;

    
public Triangle() {
        setTitle(
"Triangle");
        setSize(
new Dimension(300200));
        setResizable(
false);

        init();

        Container container 
= getContentPane();
        container.add(mainPanel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(
true);
    }

    
private void init() {
        mainPanel 
= new CanvasPanel();
    }

    
public static void main(String[] args) {
        
new Triangle();
    }
}



Sha Jiang 2008-07-24 17:02 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 国产亚洲色婷婷久久99精品91| 免费看成人AA片无码视频吃奶| 亚洲AV日韩精品一区二区三区| 国产色在线|亚洲| 日韩高清免费在线观看| 黄色网址免费在线| 日本黄色免费观看| 黄色网页在线免费观看| 亚洲中文字幕伊人久久无码| 一级毛片**不卡免费播| 韩国亚洲伊人久久综合影院| 亚洲国产精品无码中文字| 成年女人看片免费视频播放器| 五级黄18以上免费看| 亚洲成年看片在线观看| 午夜免费福利小电影| 国内成人精品亚洲日本语音| 国产乱子影视频上线免费观看| 国产一级淫片a免费播放口| 亚洲熟女综合色一区二区三区| 亚洲毛片αv无线播放一区 | 国产中文字幕免费| 在线观看www日本免费网站| 中美日韩在线网免费毛片视频| 亚洲国产精品综合一区在线| 伊人久久亚洲综合| 日本午夜免费福利视频| 日韩午夜理论免费TV影院| 亚洲国产美女在线观看| 亚洲熟女少妇一区二区| 国产在线19禁免费观看| 免费看h片的网站| a毛片全部免费播放| 男人和女人高潮免费网站| 亚洲日韩精品射精日| 精品剧情v国产在免费线观看| 91麻豆国产免费观看| 亚洲日韩国产欧美一区二区三区| 久久国产精品亚洲一区二区| 59pao成国产成视频永久免费| a级毛片免费观看网站|