Monday Apr 26, 2010

JavaFX [1.3] - Save As Image


JavaFX - Save As Image code updated to be compatible with JavaFX 1.3
Please refer to JavaFX13Utils.fx for more information. You will need to update only if you are using internal APIs as mentioned in this forum thread.

<script src="http://dl.javafx.com/1.3/dtfx.js"></script> <script src="http://javafxdemos.googlecode.com/hg/resource/SaveAsImage/1.3/SaveAsImage.js"></script>

For Applet mode, click on above image

For standalone mode

Try it out and let me know feedback

Thursday Apr 15, 2010

JavaFX + OAuth


As usual will start off with Wikipedia - OAuth (Open Authorization) - is an open standard that allows users to share their private resources (e.g. photos, videos, contact lists) stored on one site with another site without having to hand out their username and password. With more and more services moving to OAuth model, I think we need to try to have a generic implementation. Here is an attempt...

I prefer not to duplicate all those details available in various resources, so suggest to read few articles if you are not familiar with concepts of OAuth. Yahoo has a very detailed article outlining the flow of OAuth authorization or Beginner's Guide to OAuth from Hueniverse. Please refer to same for more info..

You can try out yourself with demo below. You need to get consumer-key and consumer-secret from respective service providers - Twitter, LinkedIn or Yahoo

<script src="http://dl.javafx.com/1.2/dtfx.js"></script><script src="http://javafxdemos.googlecode.com/hg/resource/JavaFXOAuth/JavaFXOAuth.js"></script>


To launch click on above image or

First enter oauth_consumer_key and oauth_secret_key, click "Request Token" button. If key is proper, you will receive a message in log with a URL. Copy and paste that URL in browser and follow the instructions. Once you grant access to your application, it will return a number. Copy the number and paste it as oauth_verifier. Now click on "Access Token" button. It will return you oauth_token and oauth_token_secret which can be used for all subsequent communication.

Yes its a bit difficult to understand the overall flow and implementation. I have tried my best to simplify it. The API may be simplified a bit more. I have signed up for contributing to JFXtras long time back, but haven't done anything yet. My objective was to pull in the various parsers that are used in different samples and create a library. I think all these can be incorporated into that...

Usage:

def oauthAPI = OAuthAPI.getInstance(
    <Service-Provider>, 
    <oauth_consumer_key>,
    <oauth_consumer_secret>
);

// Request Token Callback
oauthAPI.onRequestToken = function(response:String: Void {

}

// Access Token Callback
oauthAPI.onAccessToken = function(response:String: Void {

}

// Request Token
oauthAPI.requestToken();

// Access Token
oauthAPI.accessToken(<oauth_verifier>);
 

Refer to LinkedInAPI.fx to get an idea on how we can extend the implementation to have fulll fledged support.

Please try it out and let me know your suggestions and feedback..


<script type="text/javascript">var dzone_style = '2';</script> <script language="javascript" src="http://javafxdemos.googlecode.com/hg/resource/JavaFXOAuth/zoneit.js"></script>

Monday Apr 05, 2010

JavaFX - Modal Dialog


How to implement "Modal Dialog" in JavaFX ? Before going into details of implementation, lets first have a look at common requirement for "Modal Dialog".. It must block..

  • Mouse Events beyond the modal dialog
  • Key Events beyond the modal dialog
  • Execution of current Thread until dialog is disposed

JavaSE 6 allows to specify various types of modality as in ModalityType. We will try to implement behavior some where between Application and Document Modal :)

<script src="http://dl.javafx.com/1.2/dtfx.js"></script><script src="http://javafxdemos.googlecode.com/hg/resource/ModalDialog/ModalDialog.js"></script>


To launch click on above image or
Use of "Block EDT" may lead to deadlock and freeze application

Blocking Mouse Events is very easy, we just need to place a Rectangle whose width and height spans the entire Scene. Then set Node.blocksMouse attribute to true.

Key Events can be restricted if we could ensure that none of nodes other than child of Modal-Dialog receives focus. One way to achieve this is to disable default focus traversal. Get a list of all focus-traversable nodes in the dialog. We can set Node.focusTraversable attribute to false. Now add key-listeners to all nodes. Since focus traversal is disabled, the node will receive TAB key events. When the node receives TAB key event we can explicitly move the request to next node by invoking Node.requestFocus. Request focus for previous node for Shift + TAB key event. Please refer to FocusCycleRoot.fx for more information.

Now comes the interesting part - block execution of current thread - But JavaFX is executed on Event Dispatch Thread - EventQueue.isDispatchThread() will return true. So we cannot block this thread, as it will freeze the user interface. Assuming that the underline Toolkit of JavaFX is built on top of AWT Toolkit, we can use AWT APIs to get around this situation. Before blocking the current thread, we can push a new EventQueue instance into System-Event-Queue, so as to create an alternate path for dispatching events. After disposing the modal dialog, we can restore the original event queue using pop. Please refer to EventQueueUtils.java for more information.

Above solution is not stable enough and also not future proof. It assume that Toolkit is AWT and we have access to EventQueue (For which we need to sign the Applet), also the API may not be compatible with other profiles. In addition to this, pop API has tendency to create deadlock, there were attempts to fix this in various releases, but still doesn't provide stable behavior (especially when called from JavaFX).

So we may have to revisit the requirement - "block execution of current thread". Instead we can write the program in such a way that the display of MessageBox will be the last statement in current execution block. Thus we don't have to block the thread. Then MessageBox can handle redirection to other blocks of code by invoking functions. Thus MessageBox will act like a decision box. This approach will work with most cases and can emulate the "block thread" behavior. Also you don't have to sign the application. Please refer to MessageBox.fx for more information.

Also JFXtras has built in Dialog implementation which supports modality. Please refer to JFXtras for more information.

Please try it out and let me know feedback..


<script type="text/javascript">var dzone_style = '2';</script> <script language="javascript" src="http://javafxdemos.googlecode.com/hg/resource/ModalDialog/zoneit.js"></script>

About


The views expressed on this blog are my own and do not necessarily reflect that of my organization

Search

Categories
Archives
« April 2010 »
SunMonTueWedThuFriSat
    
1
2
3
4
6
7
8
9
10
11
12
13
14
16
17
18
19
20
21
22
23
24
25
27
28
29
30
 
       
Today