??xml version="1.0" encoding="utf-8" standalone="yes"?>99pao成人国产永久免费视频,国严精品久久久久久亚洲影视,精品999成人http://www.aygfsteel.com/jiangshachina/category/33265.html同是Java爱好者,盔R何必曾相识Q?lt;br>    a cup of Java, cheers!zh-cnTue, 16 Jul 2013 07:41:18 GMTTue, 16 Jul 2013 07:41:18 GMT60Custom Layout Manager: PyramidLayout(?http://www.aygfsteel.com/jiangshachina/archive/2012/07/15/383156.htmlSha JiangSha JiangSun, 15 Jul 2012 14:14:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2012/07/15/383156.htmlhttp://www.aygfsteel.com/jiangshachina/comments/383156.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2012/07/15/383156.html#Feedback3http://www.aygfsteel.com/jiangshachina/comments/commentRss/383156.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/383156.html
Custom Layout Manager: PyramidLayout
    已有太多关于自定义部局理器的文章了。本文仅是一学习笔讎ͼ描述了如何实CU像堆金字塔似的部局理器,很简单,也有点儿意思,可能你也会感兴趣的?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.aygfsteel.com/jiangshachina/archive/2011/05/31/351369.htmlSha JiangSha JiangTue, 31 May 2011 12:46:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2011/05/31/351369.htmlhttp://www.aygfsteel.com/jiangshachina/comments/351369.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2011/05/31/351369.html#Feedback0http://www.aygfsteel.com/jiangshachina/comments/commentRss/351369.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/351369.html
构徏不规则窗?/span>
在开发一个新微博Swing客户端的q程中希望能展现不规则的H体界面Q原?a >JDK 6 update 10提供了创建指定Ş状窗体的Ҏ,单易用,C此处?2010.05.31最后更?

Java?a >JDK 6 update 10开始将内徏支持构徏指定形状的窗体,ccom.sun.awt.AWTUtilities中的ҎsetWindowShape会根据不同的Shape实现L造相应Ş状的H体。AWTUtilitiescL攑֜SUN的包中,在用该Ҏ时应该通过反射去进行调用,如下代码所C,
Class<?> clazz = Class.forName("com.sun.awt.AWTUtilities");
Method method 
= clazz.getMethod("setWindowShape", Window.class, Shape.class);

1. 创徏正常H体
先创Z个简单的界面Q它使用BorderLayoutQ在其中安放5个JButtonQ如下代码所C,
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);
            }
        });
    }

    
// Window|于屏幕正中
    private static void setAtCenter(Window window) {
        Dimension screenSize 
= Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation((screenSize.width 
- window.getWidth()) / 2,
                (screenSize.height 
- window.getHeight()) / 2);
    }
}

执行上述E序的效果如下图所C,


2. 创徏不规则窗?
Z上述E序创徏不规则窗体,使整个窗体正好缺失掉RIGHT JButton所在的区域Q如下代码所C,
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) { // 当UIlg(JFrame)的尺寸发生改变时Q调用该Ҏ
            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
            
// 构徏一个六边ŞQ将RIGHT JButton所处的位置I缺出来
            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);
            }
        });
    }

    
// Window|于屏幕正中
    private static void setAtCenter(Window window) {
        Dimension screenSize 
= Toolkit.getDefaultToolkit().getScreenSize();
        window.setLocation((screenSize.width 
- window.getWidth()) / 2,
                (screenSize.height 
- window.getHeight()) / 2);
    }
}

执行上述E序后,会有如下图所C的效果Q?br />



Sha Jiang 2011-05-31 20:46 发表评论
]]>
你所不知道的五g事情--改进Swing(?http://www.aygfsteel.com/jiangshachina/archive/2010/10/25/336125.htmlSha JiangSha JiangMon, 25 Oct 2010 14:23:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2010/10/25/336125.htmlhttp://www.aygfsteel.com/jiangshachina/comments/336125.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2010/10/25/336125.html#Feedback0http://www.aygfsteel.com/jiangshachina/comments/commentRss/336125.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/336125.html阅读全文

Sha Jiang 2010-10-25 22:23 发表评论
]]>
利用SwingX与TimingFramework实现淡入淡出(?http://www.aygfsteel.com/jiangshachina/archive/2009/09/28/296709.htmlSha JiangSha JiangMon, 28 Sep 2009 01:46:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2009/09/28/296709.htmlhttp://www.aygfsteel.com/jiangshachina/comments/296709.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2009/09/28/296709.html#Feedback0http://www.aygfsteel.com/jiangshachina/comments/commentRss/296709.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/296709.html利用SwingX与TimingFramework实现淡入淡出
本文使用SwingX?a >TimingFramework展示了如何实现E入E出效果,E序z实用,希望对大家能有所助益?2009.09.28最后更?

在Swing中?a >AlphaComposite讄界面的半透明度,再配?a >javax.swing.Timer可以比较Ҏ地实现E入E出效果。但需要我们承具体的UIlgQƈ重写它的paintComponentҎQ同时还要ؓTimer提供一个ActionListener的实现。这些对于程序员来说Q显得有些乏呟?br />     q运地是QSwingX中的JXPanel(JPanel的子c?通过setAlphaҎ来设|半透明度,JXPanel中的所有UIlg都可随之半透明化。TimingFramework提供的Animator可以帮助我们非线性地讄JXPanel中的alpha倹{故Q我们在实现淡入淡出Ӟ可以使用JXPanel来替代JPanelQ用Animator来替代Timer?br />

    下面是一个非常简单的CZQ该CZ在一个用CardLayout的JPanel--cardPanelQ中另包含了两个JXPanel--panelA和panelBQ这两个子容器中又分别有一个JButton--buttonA和buttonB。当点击buttonAӞE入显CpanelBQ当点击buttonBӞE入显CpanelA?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.aygfsteel.com/jiangshachina/archive/2009/08/05/289996.htmlSha JiangSha JiangWed, 05 Aug 2009 13:10:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2009/08/05/289996.htmlhttp://www.aygfsteel.com/jiangshachina/comments/289996.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2009/08/05/289996.html#Feedback3http://www.aygfsteel.com/jiangshachina/comments/commentRss/289996.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/289996.html一个简单的CheckBox Tree实现
CheckBox Tree是一个十分常用的UIlgQ它能用户方便地按特定规则N树中的节点?/span>本文实现了一U简单的Checking规则Q当N了某节点后Q该节点的所有下U节点全部被N;当取消勾选某节点后,该节点的所有下U节点全部被取消N?2009.08.05最后更?

实现CheckBox Tree的常用方法,是使用JCheckBox作ؓJTree的TreeCellRendrerQƈ且需要实现特定的Checking规则来勾?取消NCheckBox?br />
1. 树节?/span>
DefaultMutableTreeNode是最常用的TreeNode实现Q此处我们将扩展q一实现--CheckBoxTreeNodeQ增加一个属?span style="color: #2000ff;">isChecked
Q用于标识该节点是否要被N上。该cȝ完整代码如下所C:
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>
如本文开头所qͼ我们用JCheckBox作ؓ树节点展现Ş式的渲染器,同时定对节点进行勾选或取消N的规则。CheckBoxTreeCellRenderer本nx一个JCheckBoxQ那么在实现getTreeCellRendererComponentҎӞ只简单地q回它自q实例卛_Q而对于勾选或取消N的条gQ则由CheckBoxTreeNode中的isChecked属性来定Q完整的代码如下所C:
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 />
               
// 当树节点被设|ؓN时Q则该节点对应的CheckBox被勾选上Q否则,取消N?/span>
               if (node.isChecked()) {
                       setSelected(
true);
                       setForeground(Color.BLUE);
               } 
else {
                       setSelected(
false);
                       setForeground(tree.getForeground());
               }
               
return this;
       }
}

3. ?/span>
此处对JTreeq行扩展Q创建CheckBoxTreeQ该cd是ؓJTreed了一个MouseListenerQ以侦听鼠标选中树节点后Q如何设|勾选标讎ͼql树?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(); // 如果该节点已被勾选上Q则此次取消勾选;反之Q亦反?/span>
                               checkNode(node, checking);

                               repaint(); 
// 重绘整棵树?/span>
                       }

                       
// 递归地勾选或取消N指定节点及其所有下U节点的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);
                                       }
                               }
                       }
               });
       }
}
上述E序有两个关键点Q?. 讄当前节点及其子节点的N标?-checkNodeQ?. 重绘?-repaint。调用repaintҎҎq行l制ӞҎTreeCellRenderer.getTreeCellRendererComponent׃被调用,此时E序׃ҎcheckNodeҎ讑֮?span style="color: #2000ff;">isChecked来勾选或取消N对应的树节点CheckBox。简a之,是先设|树型数据中的勾选标讎ͼ然后渲染器再Ҏq些标记来渲染CheckBox?br />

Sha Jiang 2009-08-05 21:10 发表评论
]]>
Java Store, Q&A(?http://www.aygfsteel.com/jiangshachina/archive/2009/07/05/285528.htmlSha JiangSha JiangSun, 05 Jul 2009 01:48:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2009/07/05/285528.htmlhttp://www.aygfsteel.com/jiangshachina/comments/285528.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2009/07/05/285528.html#Feedback0http://www.aygfsteel.com/jiangshachina/comments/commentRss/285528.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/285528.htmlJava Store, Q&A
在今q的JavaOne中,比较重要的议题之一是Java应用商店。目前还没机会亲w体会一下这个商店,但我臛_认ؓJava应用商店为广大JavaE序员提供了一个新的展C我的q_。Please show yourself! (2009.07.05最后更?

Java Store是JavaOne中最重大的消息之一。我格外Z骄傲Q因为在q去的几个月中我一直秘密地为其工作。由于这一消息Q我收到了一大堆关于该商店的问题Q以及如何将它与Java生态系l中的其它部分相兌。出于对已极佳的FAQ的补充,我想应该再回{一些问题?br />
U概括一下你所宣布的消?/strong>
我们已经发布了Java Store的私有Beta版,是一个桌面的客户端应用,它允许大家浏览ƈ购买桌面Java应用Q还有一个Java仓库的开放Beta版,Z分发应用E序Q开发者们可将q些应用E序上传到这个仓库中。现在你可以登录ƈ度一下这?a >商店?a >仓库。目前,q个商店和仓库只针对国用户Q很快将有更多的国家能够使用?br />
我可以用除JavaFX之外的其它语a来做用于Java Store的程序吗Q?/strong>
是的Q不仅仅是Java和JavaFXQ所有基于JVM的语a都是允许的。记住,最l用户ƈ不关心你的应用是用什么语a写的。他们只兛_你所做的应用是有用的Q看h和用h都很好?br />
商店中的应用E序有哪些限Ӟ
查看FAQQ可以得到全部的l节Q但要的回答是:M的JVM语句Q必面向消费者;(目前)于50MQ必L未签名,或用有效认证的{֐。在该商店商用之前,所有的应用都是免费的,商用之后你就需要付贏V此处包含的l节很少Q但q些都是基本的?br />
何时才允许我贩卖应用E序Q?/strong>
我们尽快。商店还未开张。但最l,你不会拥有一个货架空I如也的商店。这是Z么我们要l你们,开发者,旉d备好你们的应用。当我们向商用开放这个商店时Q你p够标上h格ƈ开始售卖了?br />
֮如何找到我的应用程序?
你在JavaOne大会上看到的桌面客户端只是第一个版本。我们已在努力工作,向商店加上新的特性,q将使得֮们找C的应用。将有诸如查找,qoQ排序和评论之类的新Ҏ。最后,Java Store会随Java发布Q这׃得你的应用能被近百万人发现?br />
Ud和TV应用会怎样Q?/strong>
Java Store实际包含两个斚w。店面是一个桌面客LE序Q它使你能够购买桌面应用。还有一个Java WarehouseQ这是你Q即开发者,存放待售应用E序的地斏V在未来Q还会增加针对电视和Ud应用的店面,可能会carrier branded。你所存放应用E序的Java Warehouseؓ所有的q些店面提供服务。桌面应用只是o人激动的W一步Ş了?br />
现在商店里都哪些应用了?他们来自于何处?
我们与许多伙伴公怸同工作ؓq个商店构徏新的应用Q以及修改已有的应用E序。我个h的最爱是Astronomy Picture of the DayQ由位于俄勒冈州Eugene的一个名?a >Concentric Sky的公司创建的。这个程序与NASA的太I图片相q接Q能使你览以前的图片,阅读囄说明Q甚臌能用Google Translate文本翻译成其它语言。请看Concentric Sky的CEO在他们的博客?a >对Java Store和JavaFX的描q?/a>?br />
Z么开发者们不能在其它国家登录?什么时候才能允许我们在其它国家贩卖应用E序Q?/strong>
我们尽可能快的在其它国家开放这个商店。国际N易要比你所惌的还要复杂的?作ؓ一个工E师Q我感到十分的吃?。每个国家在E率Q私有权和商业方面都有不同的法规。现在我们有法律和商业方面的伙记们在q些问题而工作。当前,我们计划?010q的早些时候实现这一目标Q但是如果我们能做得更快些,那一定会告诉你?br />
Z使消息更清晰Q我们让Jeet KaulQJava的高之一Q作一些解释:(点击观看)
SafariScreenSnapz024.png
如果你有M关于Java Store的问题,请发邮gl我Q或者在我们的反馈页面中提交你的评论?br />


Sha Jiang 2009-07-05 09:48 发表评论
]]>
更好的Applet体验Qv报(?http://www.aygfsteel.com/jiangshachina/archive/2008/11/02/237466.htmlSha JiangSha JiangSun, 02 Nov 2008 02:57:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/11/02/237466.htmlhttp://www.aygfsteel.com/jiangshachina/comments/237466.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/11/02/237466.html#Feedback2http://www.aygfsteel.com/jiangshachina/comments/commentRss/237466.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/237466.html更好的Applet体验Qv报
本文?/span>Joshua Marinacci的系列博?em>A Better Applet Experience中的W二?/span>Q介l了如何使用h帧去加快面的加载?2008.11.02最后更?

    在本pd文章的第一部分中,我向你展CZ如何使用讄加蝲时图片,包括动态的GIF自旋体图片。这ơ,我将向展C如何用屏q截图或h帧去加快面的加载?br />     Quicktime电媄有h帧的思想。电׃的一?l常是其中的第一?会攑ֈ该电影出现的地方。当用户点击h帧时Q实现的电媄才会通过|络被加载进来。这p极大地加快该电媄所在Web面的加载速度。用少许JavaScriptQ完全可以ؓJava Applet实现相同的功能?br />
Applet的v报
    在研I这个Demo之前Q我必须要提刎ͼ我个人尚未在IE览器中试q这个Demo。如果你发现q个Demo不能在某个浏览器中运行,请向错误信息发送给我,以便我能更新q个JavaScript?/strong>
    基本思想非常的简单,创徏一个divQ它包含一个链接和一张屏q截图。当用户点击该链接时Q我们用一个新?code>applet元素L换页面中?code>a?code>img元素。一旦浏览器察觉Cq个新的applet元素Q它下载Java插gq启动这个Applet?br />     q就有一个例子:如果你点Mq张囄Q一个Applet׃被加载到该图片所在的位置Qƈ会说"applet loaded"?br />
JavaScript
    如下是q个JavaScript脚本Q?br />
<script>
function generateInlineAppletTag(appletID, screenshotID) {
    
var attributes =
 {
        code:'animatedstartup.MainApplet',
        width:
100
,
        height:
100
,
        archive:'http:
//projects.joshy.org/demos/AnimatedStartup/AnimatedStartup.jar',

        id:'fooApplet'
    };
    
var parameters =
 {
        image:'http:
//projects.joshy.org/demos/AnimatedStartup.gif',

        centerImage:'true'
    };
    
    
    
var appletTag = document.createElement("applet"
);
    
    
for (var attribute in
 attributes) {
        appletTag.setAttribute(attribute,attributes[attribute]);
    }
    
    
if (parameters != '#ff0000' && parameters != null
) {
        
for (var parameter in
 parameters) {
            
var param = document.createElement("PARAM"
);
            param.setAttribute(
"name"
,parameter);
            param.setAttribute(
"value"
,parameters[parameter]);
            appletTag.appendChild(param);
        }
    }
    
    
    
var bodyRef =
 document.getElementById(appletID);
    
var screenshot =
 document.getElementById(screenshotID);
    bodyRef.removeChild(screenshot);
    bodyRef.appendChild(appletTag);
}
</script>
该脚本的W一部分初始化了两个哈希表,它们包含?code>applet元素的属性与嵌套的param标签。然后,它会使用document.createElement()Ҏd个appletQƈ配置其中的属性与PARAM元素。到目前为止Q还很直接。真正地奇妙之事发生?code>generateInlineAppletTag函数的最后四行。它使用传入?code>appletID参数与包含着上述链接与图片的div元素相联在一P然后它会扑ֈq删除该链接Q而用新的applet元素L代这个链接?br />
HTML
要用上qjavascript函数Q你只需它攑ֈ面的顶部,q过那张屏幕截图链接的href去调用它。在本例中,我用了Q?br />
<div id="appletDiv">
<id="screenshot1" href="javascript:generateInlineAppletTag('appletDiv','screenshot1');">
<img src="http://projects.joshy.org/demos/AnimatedStartup/applet_screenshot.png" border="0"
/>
</a>
</div>
q个div被命名ؓappletDivQ链接被命名?code>screenshot1。该链接?code>href会调用上qjavascript函数Qƈ传入div与链接的名称。最后该囄只是显C将要运行的Applet的一张屏q截图,该图被一个播放按钮覆盖着。就q么单,?/span>q里你可以看到完整的javascript和HTML语句?br />
l论
q个javascript只是一个开始。你q能很容易的扩展它,使图片上能展现关于这个Applet的更多信息。你也可以把q个javascript重写Z个更加可重用的Ş式,使它能够被你的整个站Ҏ׃n?br /> 下次我将向你展示如何使用新的发布工具包去侦测当前已安装的Java版本Qƈ启动更新E序?br /> 重复一遍,如果你在某个q_或浏览器中发CM错误Q请让我知道Q以便更新这个脚本?/strong>



Sha Jiang 2008-11-02 10:57 发表评论
]]>
更好的Applet体验Q定制加载时画面(?http://www.aygfsteel.com/jiangshachina/archive/2008/10/29/236954.htmlSha JiangSha JiangTue, 28 Oct 2008 23:32:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/10/29/236954.htmlhttp://www.aygfsteel.com/jiangshachina/comments/236954.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/10/29/236954.html#Feedback2http://www.aygfsteel.com/jiangshachina/comments/commentRss/236954.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/236954.html更好的Applet体验Q定制加载时画面
    本文?/span>Joshua Marinacci的系列博?em>A Better Applet Experience中的W一?/span>Q介l了如何定制加蝲Applet时用的画面?2008.10.30最后更?

    你可能已l听说了Java SE 6 Update 10应当会改qApplet体验。你可能已经看过一些可在浏览器中拖拽的AppletCZQ但q有比那更多的东ѝ在本博客系列中Q我向你展C如何在发布Applet时获得尽量多的东西,U你不使用Update 10?br />
摆脱咖啡杯图?/strong>
    很多人抱怨的W一件事情就是加载Java Applet时用的咖啡杯图标。根据你具体使用的OS和JVM版本Q这个图标是不同的,但它看v来L像下N栗?br />
    有很多理由可以认会困扰到应用E序开发者,包括不能Z们自q软g标注品牌Q破坏应用的视觉观感Q滥用橘黄色。这些都是正的批评。但在这儿我要告诉你Q无遵循这U方式。这个橘黄色的图标只是一U默认的方式|了。你LpQ也应该加载画面所使用的图片改成与你网站的其它部分盔R应的图片?br />     在Java SE 6 Update 10出现的很长时间之前,Applet插g已l支持在加蝲画面中用定制图片了。只需讄Applet?em>image参数可以了。就是这么简?q儿有一个例子:
<applet code="animatedstartup.MainApplet"
        archive
="AnimatedStartup.jar"
        width
="100" height="100"
        
>
    
<PARAM name="image" value="earth.gif"/>
    
<PARAM name="boxmessage" value="loading"/>
    
<PARAM name="boxborder" value="false"/>
</applet>
image参数设|一个加载时囄。Update 10q支持添加加载时信息Q以及不l制Applet的边框,?em>image是比较重要的一个参数。上面这个例子看h像下面q样Q?br /> 屏幕截图[1]

制作加蝲时动?/strong>
    Java 6目前支持使用动态图片以d加蝲时动甅R在前面例子中用的earth.gif囄文g正是一个动态GIF文g。如果你有最新的Applet插gQ就会看到加载时画面是动态的。当Ӟ你可能想要一个自旋体的图片,它更合适些Q就如你在这里看到的那样Q你也可以用一个更h指示性的GIF加蝲囄Q就?/span>q里的图片那?sup>[2]?br />     关于Applet加蝲时画面的更多内容误发布文档?/span>特别属性一?/span>Q以?/span>关于q个新插件的说明?br />     本周是q些了。在此处你可看到q个Demo的可q行版本。下ơ我向你展C,在运行一个Applet之前Q如何用一个屏q截囑֎替代q个真实的Applet?br />
译注
[1]原文q未昄q张囄?br /> [2]本句很有些奇怪,此处的两?q里"应该指同一个地址?br />


Sha Jiang 2008-10-29 07:32 发表评论
]]>
Java SE 6 Update 10发布?(?http://www.aygfsteel.com/jiangshachina/archive/2008/10/17/234849.htmlSha JiangSha JiangFri, 17 Oct 2008 13:37:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/10/17/234849.htmlhttp://www.aygfsteel.com/jiangshachina/comments/234849.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/10/17/234849.html#Feedback7http://www.aygfsteel.com/jiangshachina/comments/commentRss/234849.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/234849.htmlJava SE 6 Update 10发布?
    在经q了漫长的期待之后,Java SE 6 Update 10l于正式发布了。本文主要简介了该版本在客户端应用方面的改进?2008.10.18最后更?

Java SE 6本就加入了许多关于客L应用的新Ҏ,?a >Java SE 6的十大新Ҏ?/a>中,直接关于客户?桌面领域的新Ҏ就有两处。此ơUpdate 10更是集中地在该领域内做出了重大改q。此处,主要ZJava SE 6 Update 10 Release Notes的说明,介了该版本在客户端应用方面的改进?br />
下一代Java Plug-in
    下一代Java插g包含了Applet和Java Web Start技术的最x构特性。它为在Web览器中发布Java和Java FX内容提供了健壮的q_。下一代Java插g为高U用户内容和企业U应用提供了许多强大的特性?br />     * 允许为Applet甌更多的内存;可ؓ每个Applet应用指定不同的命令行参数?br />     * 为每个Applet应用选择不同的JRE?br />     * 提高了可靠性?br />     * 能在Java和JavaScriptE序设计语言之间q行更好、更便捷的整合?br />     * 增强了对讉KWeb面中DOM的支持?br />     * 增加了对Web Services的支持?br /> 内徏支持JNLPQ得Applet应用可立卛_用之前由Java Web Start应用使用的JNLP扩展Q例如JavaFXq行时组Ӟ对基于硬件加速的3D囑ŞQ视频回攄{?br />     P.S. 在我较早前的一译?strong>下一代Java Applet插g技?/a>
中,对这个新的插件有较详的描述?br />
Java Quick Starter
    Java Quick Starter(JQS)Z提高AppletE序和Java应用E序的初始启动速度Q会周期性预加蝲一些常用的JRE文g到内?占用不多?0M的内?。之后,当JavaE序启动Ӟ盘I/O会显著减少Q那么启动速度也就大大加快了。JQS会作Z个Windows服务启动Q在d理器中会看C个名为jqs.exe的进E?br />     注:JQS仅能用于x86架构下的Windows 2000和Windows XPpȝQ由于Windows Vistapȝ有其自己的预加蝲机制QJQS不能用?br />
Deployment Toolkit
    Z避免览器的兼容性问题,Deployment Toolkit提供了一lJavaScriptҎQ能够自动生成部|Applet和Java Web StartE序时所使用的HTML语句?br />
Nimbus
    Nimbus是一个新的Java跨^台外观。在JDK 6 Update 10自带的demo中新加了一个SwingSet3应用Q但与其它的demo应用(如SwingSet2)不同Q这个demo应用没有包含源代码和可执行的jar文gQ而需要通过Java Web Startq行(我猜想SwingSet3应该q处于开发阶D?。官方的介绍中有一张图片,大家可以看看Q确实漂亮多?此前Q默认的Metal外观已经多年未更C)?br />  



Sha Jiang 2008-10-17 21:37 发表评论
]]>判定一个点是否在三角Ş??http://www.aygfsteel.com/jiangshachina/archive/2008/07/24/217214.htmlSha JiangSha JiangThu, 24 Jul 2008 09:02:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/07/24/217214.htmlhttp://www.aygfsteel.com/jiangshachina/comments/217214.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/07/24/217214.html#Feedback13http://www.aygfsteel.com/jiangshachina/comments/commentRss/217214.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/217214.html判定一个点是否在三角Ş?/span>
如何判定一个点P是否存在于指定的三角形ABC内,q肯定是一个简单的问题Q本文仅用一个图形界面程序展CZ该问题,有兴的朋友可以看看?2008.07.24最后更?

在此处用一U常见且便的ҎQ?strong>如果三角形PABQPAC和PBC的面U之和与三角形ABC的面U相{,卛_判定点P在三角ŞABC?包括在三条边?
?br /> 可知Q该Ҏ的关键在于如何计三角Ş的面U。幸q地是,当知道三角Ş点(AQB和C)的坐?(Ax, Ay)Q?Bx, By)?Cx, Cy))之后Q即可计出光U:
= |(Ax * By + Bx * Cy + Cx * Zy - Ay * Bx - By * Cx - Cy * Ax) / 2|

关键的代码如下,
// q定的三个点的坐标,计算三角形面U?br /> // Point(java.awt.Point)代表点的坐标?/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;
}

// 判断点pos是否在指定的三角形内?/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;  // ׃点数的计算存在着误差Q故指定一个够小的数Q用于判定两个面U是?q似)相等?/span>
    if (Math.abs(triangleArea - area) < epsilon) {
        
return true;
    }
    
return false;
}

执行该应用程序,用鼠标在其中点击三次Q即可绘制一个三角ŞQ如下组图所C:

然后仅需Ud鼠标Q就会出C个空心圆圈。如果圆圈的中心在三角内(包含在三条边?Q则圆圈昄为红Ԍ否则Q显CZؓ蓝色。如下组图所C:


完整代码如下Q?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 发表评论
]]>下一代Java Applet插g技??http://www.aygfsteel.com/jiangshachina/archive/2008/07/14/214703.htmlSha JiangSha JiangMon, 14 Jul 2008 11:56:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/07/14/214703.htmlhttp://www.aygfsteel.com/jiangshachina/comments/214703.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/07/14/214703.html#Feedback2http://www.aygfsteel.com/jiangshachina/comments/commentRss/214703.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/214703.html下一代Java Applet插g技?/span>
    Java SE 6对Java桌面应用q行较大的升U,q启动了Java SE 6 Update N计划Q该计划旨在化JRE的大,增进用户的安装体验,q提供了一个新的Applet览器插Ӟ该插件将会随Java SE 6 Update 10发布?a >本文全面介绍了这个新插g的关键特性,q以NASA?a >World WindZ介绍了该插g的应用?2008.07.15最后更?

Applet回来了!
Z在网l中传递你的程序,是时候再ơ考虑Java Applet技术了?a >下一代Java插g技?/a>以一U不同的Q比q去更高效、更可靠的途径来运行Applet。现在你可以获得如下好处Q?br />
  • 增强的可靠?/span>
  • 改进的用户体?/span>
  • 在后台启动Applet
  • 内徏的JNLP支持
  • 针对每个Applet的命令行参数
  • 堆内存大,Java 2D API加速选项
  • 改进的Java/JavaScriptE序设计语言集成
  • 改进的Windows Vista支持
  • {֐的Applet现在可以在Internet Explorer的保护模式中正常q行
下一代Java插g提供了一U完全重新设计的架构Q它出现在Java SE 6 Update 10中。该插g行在|络览器中的Applet提供了强大的新功能,它以向后兼容的方式改q了整个Applet的可靠性及功能?br /> 下一代Java插g最有意义的新特性是它内建支持通过JNLP文g启动Applet。用JNLP文g格式作ؓApplet的描q符p允许Applet马上复用之前为Java Web Start应用所写的JNLP扩展?br />
执行Applet的新途径

执行Applet的新途径在结构上与Java Web Start技术相|但与览器整合的更ؓ紧密。Applet不在q行于网l浏览器内的JVM中,而是会启动一个独立的JVMq程去运行Applet。默认地Q只有一个JVM被启动Q但你也能启动多个JVMQƈ且可以ؓ每个Applet都设|命令行参数Q所以你能媄响堆内存的大或其它的要求?br />
              
Figure 1. Applet Architecture
在上图中Q云表示JVM实例。在览器内有一个小的,headless JVM被用于管理一个或多个客户端JVM之间的连接,q些JVMq行着Applet。在该图中,Duke表示Applet。其中,一个JVM实例q行着两个AppletQ另一个运行着一个Applet?br /> Applet直接从JNLP文g启动Q它使用的JNLP文g与Java Web Start软g使用的描q符文g相同Qƈ且允怋用比典型?archive"Q?code"?cache_archive"更ؓ强大的参数?br /> 新的插g提供了:
  • 能够讉K之前仅由Java Web Start软g专用的高UJNLP扩展。之前有部分参数能够用,但有一些限Ӟ现在q些限制则被去除?/span>
  • 通过Applet讉KJNLP API?/span>
  • 支持PersistenceService和DownloadService?/span>
  • 能够控制堆内存大,命o行参敎ͼJRE版本选择和自动下载。你hJava Web Start软g所拥有的相同功能?/span>
现在你就可以在Web面中用像下面q样的语句了Q?br />
<applet width=500” height=500>
    
<param name=”jnlp_href” value=”my_applet.jnlp”>
</applet>
调用Applet生命周期ҎinitQstartQstop和destroy会更为确定,q且已经改进了跨览器行为。完全支持Appletc装载器~存Q遗留的Applet生命周期及对向后兼容性的需求,q且q些行ؓ都已得到了改q?br /> Appletq行的就像一个由Java Web Start启动的应用。参数jnlp_href在Web面和Applet的JNLP描述之间起到了桥接的作用。在如宽度与高度q样的特定方面,Applet标签与JNLP文gh重叠的机制?br /> 一般地Q你应该使用Deployment ToolkitQ这也是一个出现在Java SE 6 Update 10中的新工P它能自动CؓApplet标签生成HTML?a >部v指南展示了如何用Deployment Toolkit便地发布Applet?br />
配置Applet
现在也能更ؓ单地在多个方面来配置AppletQ包括堆内存大小Q需要被使用的Java版本Q类加蝲器缓存,边界Q及其它?br /> <applet>与JNLP文g在针Ҏ些参数时有重叠的机制。这些冲H可以用如下Ҏ解决Q?br />
  • width and heightQ这些属性将L?lt;applet>Q而不是JNLP文gQ中获取。这是假设浏览器知道Applet在Web面上应该显C多大,也只有浏览器才能支持相对于页面的宽度与高?例如Qwidth="50%")?/span>
  • codebaseQ如果JNLP文g?lt;jnlp>标签中指定了一个绝对的codebaseQ那么就使用它。否则,用在codebase handling一节中描述的规则进行组l?/span>
  • codeQ当指定了jnlp_href参数QApplet的主cd从main-class参数换成JNLP文g中的applet-desc标签Qƈ且code属性会被忽略。注意,该特性允怽为经典Java插g写一个拥有反馈的Applet标签Q但在新的Java插g中,该标{֏使用更高U的功能。请见下面的"兼容?一节?/span>
  • M一个由<param>标签指定的Applet参数与JNLP文g中指定的参数q行合ƈ。如?lt;applet>标签和JNLP文g都指定了同一个参敎ͼ<applet>标签中的版本覆盖JNLP文g中的版本Q除了参数java_arguments和java_version?/span>
  • 新的java_arguments和java_version参数在JNLP Applet中是不必要的。会替换为通过JNLP文ghJRE版本或向JVM传递参数的机制。所以,命o行参数和JNLP文gh的JRE版本会覆盖HTML中ؓApplet指定的这些倹{?/span>
  • 特定的参敎ͼ例如imageQboxbgcolor{等Q在Applet的启动过E中是有用的。在HTML而不是JNLP文g中指定这些参数可能更好些Q以便于在加载Web面时就可立卌取它们,而不用再{到单独下蝲JNLP文g之后?/span>
q去Q通过Java控制面板讄最大堆内存是有限制的。在新的Java插g中,q些限制被取消。现在Applet可以像命令行应用那样使用大量堆空间?br /> 指定一个比默认值大的堆I间Q?br />
<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">      
    
<PARAM name="java_arguments" value="-Xmx128m">  
</APPLET>
指定一个非默认大小的堆内存以及一个Java 2Dg加速器选项Q该选项帔R过JOGL使用OpenGL应用于Applet?br />
<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">      
    
<PARAM name="java_arguments" value="-Xmx256m -Dsun.java2d.noddraw=true">  
</APPLET>
如果你喜Ƣ,一个Applet可强制进入一个属于它自己的JVM实例Q而与所有其它的Applet隔离开Q?br />
<param name=”separate_jvm” value=true” />
当把某些桌面应用UL到Web览器时Q这有用了?br /> 你也能特定的Appletq行在特定版本的JRE上,如下所C:
<j2se version=1.4+” >
<j2se version=1.5*” >
当想针对特定版本的JREQ或Applet取代早期版本的选择机制(如同IE览器中的CLSID)Q进行质量测评时Q该Ҏ很有用了。如果请求了一个非常老的JRE版本Q就会强制执行限Ӟ如果Applet试图加蝲未签名的代码Q将会提C用戗?br /> 注意Q因为支持JNLP的Java插g是在Java SE 6 Update 10中才首次出现的,所以指定像“1.4+”q样的版本基本上没有意义的。当需?#8220;1.7+”Ӟq才有意义?br /> 另外Q你可以在JNLP文g中?lt;update>标签来显著降低第二次及接下来各次启动的时间?br />
<update check=”background”>
在这U情况下Q将使用~存中已有的AppletE序Qƈ且在后台下蝲该应用的更新版本。在下次启动Ӟ׃使用新版本?br /> 新的插g也能更好地对囑փq行定制Q在Applet被加载之前会展示该图像。image参数会以支持动画GIF文g作ؓ目标Q?a >Java Plug-in Developers' Guide?a >Special Attributes一节对此有描述。此外,C支持如下新的参数Q?br /> boxborder
一个布型参数Q用于指定在Applet被加载之前是否在Applet区域的边~绘制一个宽度一象素的边框。默认ؓtrue。我们徏议将该D|ؓfalseQ特别是一个动画GIF用作加蝲期图像时Q以避免可能的闪烁?br /> centerimage
一个布型参数Q用于指定是否将加蝲期图像在Applet区域内居中显C,而不是从左上角v始。默认ؓfalse?br /> 使用参数boxborder和centerimage的例子:
<APPLET archive="large_archive.jar"
    code
="MyApplet"
    width
="300" height="300">
    
<!-- Use an animated GIF as an indeterminate progress bar
        
while the applet is loading -->
    
<PARAM NAME="image" VALUE="animated_gif.gif">
    
<!-- Turn off the box border for better blending with the
        surrounding web page 
-->
    
<PARAM NAME="boxborder" VALUE="false">
    
<!-- Center the image in the applet's area -->
    
<PARAM NAME="centerimage" VALUE="true">
</APPLET>

兼容?/span>
现在可更Ҏl护向后兼容性。你可创行在更早Java插g版本上的E序Q但仅需提供一个与jnlp_href参数一L格式完整?lt;applet>标签可使用q些新特性了。早期版本的JRE会忽略jnlp_href参数Q{而?lt;applet>标签。新的Java插g技术将忽略archive和code参数Q而仅使用JNLP文gd动Applet?br />
World Wind AppletCZ
由World Wind Java开发组创徏?a >NASA World Wind Java AppletCZ阐述了如果发布像NASA World Wind Javaq样的领先类库。同样地Q也用示例说明了如何使用JavaScript在Web面中高效地整合HTML和Applet内容?br />
              
Figure 2. NASA World Wind Applet
该Web面包含了关于喀斯喀特山脉的信息(要感谢维基百U?Qƈ且将World Wind Java作ؓ一个Applet嵌入其中Q以囄该山脉中各山的位|?br />
<applet id="wwjApplet" width=600 height=380             
    code
="gov.nasa.worldwind.examples.applet.WWJApplet"             
    archive
="BackwardCompatibility.jar">
    
<param name="jnlp_href" value="WWJApplet.jnlp">     
</applet>
WWJApplet随标准的World Wind Java发行?/a>发布。如下所qͼ你可选择~写你自qAppletcdƈWorld Wind嵌入其中Q?br /> 下面是WWJApplet.jnlp文g中相关的部分Q?br />
<jnlp href="WWJApplet.jnlp">
<resources os="Windows">         
<property name="sun.java2d.noddraw" value="true"/>       
</resources>       
<resources>         
<j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>         
<jar href="worldwind.jar" main="true" />         
<extension name="jogl"            
 href
="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp" />       
</resources>       
<applet-descname="WWJ Applet"           
    main
-class="gov.nasa.worldwind.examples.applet.WWJApplet"           
    
<!-- Overwritten by the surrounding web page -->           
    width
="100"            
    height
="100">       
</applet-desc>     
</jnlp>
注意几点Q?br />
Web面中的HTML链接调用JavaScript函数Q该函数会与Appletq行交互q将其导向合适的山峰。下面是q些链接中的一个:
<a href="javascript:gotoLocation(MOUNT_RAINIER);">Mount Rainier</a>
    (southeast of Tacoma, Washington) 
当点击该链接后,会调用JavaScript函数gotoLocation。该函数定义在同一个Web面中:
function gotoLocation(locationString) {
    
var params = locationString.split(';');
    
if(params.length == 3)  // Lat/lon
    getWWJApplet().gotoLatLon(parseFloat(params[1]),
    parseFloat(params[
2]));
    
}
Web面HTML中的山峰位置被解码为JavaScript字符丌Ӏ将从这些字W串中解析出U度Q经度及其它视觉信息Qƈ它们传递给Applet?gotoLatLonҎ是在WWJAppletcM定义的;上面的方法调用将起动一个JavaScript-to-Java调用Q把参数从JavaScript引擎传给Java。World Wind Applet接收该通知Qƈ视点以动画的方式切换到适当的地斏V注意,gotoLatLonҎ会迅速地q回Q以便浏览器不必{待它的完成Q该动画会在一个单独的JavaU程中运行?br />
  
Figure 3. World Wind Applet with Mount St. Helen's Clicked
如上所qͼWorld Wind Java集成C的应用程序或AppletE序中的最好方法是其作ؓ一个JNLP扩展。这允许很多来自|络的集成了World Wind Java的应用程序或AppletE序能够׃nWorld Wind代码资源。ؓ了引用World Wind JNLP扩展Q你需下面的语句行加入到你的应用E序或AppletE序的JNLP文g中的<resources>部分Q?br />
<extension name="worldwind" href="http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp"/>     
<extension name="jogl"       
    href
="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp"/>
注意QWorld Wind扩展JNLP是区分版本的Q所以你需参考World Wind文档或访?a >论坛LC的JNLP会引用到的扩展的最新版本?a >World Wind Central是一个关于World Wind最C息的有用资源?br /> World Wind作ؓ一个扩展用就意味着你不能将WWJApplet直接作ؓ你的main-class使用。由于JNLP文g格式的语义,主jar (main="true")必须定义在主JNLP文g中。但很容易就能适应该限Ӟ你可单地创徏你自qWWJApplet子类(UC为MyWWJApplet)Q而它q不做Q何事情:
class MyWWJApplet extends WWJApplet {}
worldwind.jar|于classpath中,q编译上q类Q然后将该类攑օ它自qjar文g中。引入这个jar作ؓ你的主jarQMyWWJApplet成Z你的main-classQ然后将其作为JNLP扩展引入到World Wind中?br />
l论
介绍了Java插g对JNLP的支持,qؓApplet的发布提供了很多新的可能Q这对在览器内外发布Java内容的方法的l一又进了一大步。Applet自从它们起始已过了很长的旉Q现在随着对JNLP的支持,它们会比以往更快Q也更易于定制?br />


Sha Jiang 2008-07-14 19:56 发表评论
]]>
Java Applet不适用于这L应用Q??http://www.aygfsteel.com/jiangshachina/archive/2008/02/26/182208.htmlSha JiangSha JiangTue, 26 Feb 2008 06:07:00 GMThttp://www.aygfsteel.com/jiangshachina/archive/2008/02/26/182208.htmlhttp://www.aygfsteel.com/jiangshachina/comments/182208.htmlhttp://www.aygfsteel.com/jiangshachina/archive/2008/02/26/182208.html#Feedback9http://www.aygfsteel.com/jiangshachina/comments/commentRss/182208.htmlhttp://www.aygfsteel.com/jiangshachina/services/trackbacks/182208.htmlJava Applet不适用于这L应用Q?/span>
    在基于浏览器的应用中Qؓ何Flash大大行于Java Applet?Java Applet是否真的不适用于这L应用场景Q?a >John O'Conner有话要说...(2008.03.29最后更?

    我已正与一个公怸起创Z个聊天系l,以帮助该公司能够在线地销售出它们更多的品。后端全是JavaQ还有SpringQServletQ?..都是些好东西。前端是...好吧Q是Flash?br />     当有可能Ӟ我更喜欢在每个地斚w使用JavaQ故我就q个面向客户的应?-一个真实的聊天客户端程序选择使用Flash而提Z一些问题。这个谈话进行v来就像这P
    JohnQ哇Q这个品在每处都用了JavaQ但前端除外Q而这正是客户与之实际交互的地斏Vؓ什么在那儿选择FlashQ?br />     Dev mgrQ是的,Flash很容易。用这样一个简单的UI也是很容易的?br />     JohnQ我明白Q但使用Java也可十分单地做出q个聊天UI。现在,Swing的布局理器已很容易用,特别是当你用像NetBeansq样的IED来布局UI时?br />     Dev mgrQ那可能是对的,但这U选择不仅仅是Z易地创徏UI?br />     JohnQ哦Q那是什么呢Q?br />     Dev mgrQ每个客L览器中都有Flash。我们不必再安装一个运行时E序了?br />     JohnQJava也将会那P不是吗?大部分的PC刉商都包含它了?br />     Dev mgrQ也许,但我们知道Flash肯定是那L。Flash遍及|络Q而且很可能客户已l有了Flash的运行时E序。如里没有的话,下蝲与安装这个运行时E序也是很快、很Ҏ的?br />     JohnQ是的,但Java也将易于安装?br />     Dev mgrQ但是Java会花费很长的安装旉。它太大了?br />     JohnQ我不知道现在是否还是那栗ؓ了ɘq行时程序更也更加的模块化Q已l做了很多工作。所以你仅需要下载你所需要的部分?br />     Dev mgrQ我们所需要的是非常、非常的单。一个非常简单的UIQ它有着非常单的功能M转聊天文本。Flash可以做得很好?br />     交谈l箋着Q但我不惛_得太ѝ可能Flash做小应用时会比Java做的更好Q在Sun工作了如此长的时_我就很自然地惛_Java无处不在Q而且其它的每个h也都喜欢它。我一直都能把事情做好...但很昄Q不是每个h都能做到。下载文件的大小从未烦扰q我...但它实烦扰C其它的一些h?br />     另外Q我发现感觉与现实一样重要。所以,如果Java现在更快Q更dyQ而且在浏览器中工作得极好Q那会怎样呢?不知何故Q这q是没有用。旧有的感觉仍就在那?-Java很慢Q很大,而且很难在浏览器中工作。更令h惊讶的是Q你会发现有些h在那U情况下再也不把Java当作他们的解x案了?br />     我联pM一些朋友,他们一h建面向客L|站。他们也是用Flash。那么Java呢?当然...都是在后端的业务逻辑中。那么对于客户将会用到的应用呢Q如果这些应用是嵌入到浏览器中的Q它们就会用Flash。哇!
    q样Q你如何对待q种感觉呢?Java需要做些什么以反击q些旧有的感觉?Z么Flash在基于浏览器的应用中更ؓ行Q我们如何才能那些应用转而用JavaQ?br />


Sha Jiang 2008-02-26 14:07 发表评论
]]>
վ֩ģ壺 ۩| ϳ| ¡| | ̩| | | Ϻ| Ͻ| ʤ| | ߷| | пѷ| ¡| Ϫ| ֦| ų| | | | «| Ϸ| | ͷ| | Ƹ| | Ǩ| | | | | | ϰ| | | ɽ| | | |