Saturday, February 6, 2010

Sina opens App Engine (SAE) service like GAE

Sina opens an App Engine service, named SAE, some while ago, and is now at alpha 2, public for registration in China.

This SAE service is very similar to Google App Engine in that it provides a cloud environment for applications to run on. Unlike GAE, SAE supports the PHP + MySQL combination. This means, potential, more web applications could be migrated to sina app platform. Actually, the famous blogging application, Wordpress, is already migrated. Although flexible, the use of MySQL as a database storage might mean the scalability will not be so good.

Sina App Engine and My SAE App

Monday, January 4, 2010

Trick or Treat, LayoutFocusTraversalPolicy

Have you ever met such focus traversal issue in Java UI applications? By default, LayoutFocusTraversalPolicy is used to determine the sequence of focus traversal. As stated in Java documents, it sorts components based on their size, position, orientation etc.. However, when two identical components are laid at the same position, there will be a focus traversal issue.

A demo is better than a thousand words. Copy the code to a file FocusTraversal.java and compile and run it.

package tsul.example;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.lang.reflect.Field;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class FocusTraversal extends JPanel {

    JButton b1 = new JButton("Columns");
    JButton b2 = new JButton("Rows");
    JTextArea content = new JTextArea("Textarea");
    /**
     * This is the main pane
     */
    JScrollPane pane = new JScrollPane();

    public FocusTraversal() {
        super(new BorderLayout());

        pane.setColumnHeaderView(b1);
        // Try to add a duplicate component to pane's header. In such a case,
        // the default
        // LayoutFocusTraversalPolicy won't work properly as expected. The
        // result is we
        // cannot move focus from Columns to Rows by tabling.
        try {
            Field f = Container.class.getDeclaredField("component");
            // bypass default security check
            f.setAccessible(true);
            ArrayList comp = (ArrayList) f.get(pane.getColumnHeader());
            comp.add(b1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        pane.setRowHeaderView(b2);
        pane.setViewportView(content);
        setPreferredSize(new Dimension(600, 400));
        add(pane, BorderLayout.CENTER);
    }

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

            @Override
            public void run() {
                frame = new JFrame("Focus Traversal Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                FocusTraversal panel = new FocusTraversal();
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    static JFrame frame;

}