pivot-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Greg Brown <gk_br...@verizon.net>
Subject Re: [pivot] are there any tools to convert bxml to Java?
Date Tue, 04 Jan 2011 18:00:39 GMT
In order to make GenericTableView work in BXML at all, you'd need to move the Class<T>
argument from the constructor to a property. You could do something like:

public Class<?> getBeanType();
public void setBeanType(Class<?> beanType);
public void setBeanType(String beanType);

The String overload of setBeanType() would simply call class.forName() internally, so you
could do this in your BXML:

<GenericTableView beanType="com.foo.MyBean"/>

Alternatively, since it is really just being used to initialize the columns, perhaps this
would be more appropriate:

public void setColumns(Class<?> beanType);
public void setColumns(String beanType);

Then you could potentially attach annotations to each property (via the getter method) to
return things like default column width, etc. 

G

On Jan 4, 2011, at 12:47 PM, Gerrick Bivins wrote:

> +1 for this example!
>  I had been thinking about something like this as well to simplify creating table views
for java Beans, ie, dynamically creating the table columns based on properties. This addresses
part of what I was trying to do.
> What would really be slick is if that Class parameter in the constructor could be made
Bindable so it could dynamically specified via BXML ala:
> 
> ...
> <bxml:define>
>    <Class bxml:id="beanClass">
> </bxml:define>
> ...
> <GenericTableView class="$beanClass" ...>
> ...
> 
> 
> Gerrick
> 
> 
> On Tue, Jan 4, 2011 at 11:11 AM, calathus <calathus@gmail.com> wrote:
> 
> 
> On Mon, Dec 20, 2010 at 5:54 PM, Greg Brown <gk_brown@verizon.net> wrote:
> > My goal was to create a generic class to support CRUD GUI from a given Java Beans
class. Although it is not generic version, Vaadin provides such sample implementation which
may be  immediately used for real projects.
> 
> I'd be interested in learning more about how you envision something like this might work.
> 
> Greg,
> 
> I created a sample generic  TableView class which can take a parameter bean class and
using the reflection library, it defines table view's column fields. This class is modified
from tutorials tableviews sample.
> This is only for demonstration of the generic class approach in Pivot using builder class
approach.
> 
> In general, if we introduce new annotations for entity beans class to define more presentation
related information (like width of column) , we can fine tune the look and feels.
> And the same entity beans can have another JPA annotation from which DB scheme can be
generated and also some utility (like in netbeans) will allow to generate restful API from
the entity beans. 
> 
> So if we define more GUI feature to support CRUD operation as generic class library,
it become very simple to develop DB based web application.
> There is an  open source project called openxava which has similar approach, but its
GUI is based on JSP and not so impressive compared to other GUI(web) projects.
> The degree of usability of such generic library may not be so general, but if there are
a lot of entity classes, this type of approach would be quite useful.
> Also the pattern of these class may be used as starting point for other type of CRUD
GUI.
> 
> Following is the sample code:
> 
>     public static class GenericTableView<T> extends TableView {
>     	
>     	private final Class<T> cls;
>     	
>     	public GenericTableView(final Class<T> cls, final Map<String, Object>
namespace) throws Exception {
>     		this.cls = cls;
> 
>             for (final Field field: cls.getFields()) {
>             	final String fname = field.getName();
>             	getColumns().add(new TableView.Column() {{
>             		setName(fname);
>                     setWidth(3, true);                            
>                     if (fname.equals("flag")) {
>                     	setCellRenderer(new TableViewImageCellRenderer() {{
>                     	}}); // INSTANCE, name: <content:TableViewImageCellRenderer>
>                     } else {
>                     	setHeaderData(getCapitalName(fname));
>                     }
>                     System.out.println(">>> fname: "+fname);
>                 }});
>             }
>             getTableViewSortListeners().add(new TableViewSortListener.Adapter() {
>                 @Override
>                 @SuppressWarnings("unchecked")
>                 public void sortChanged(TableView tableView) {
>                 	tableView.getTableData().setComparator(new org.apache.pivot.wtk.content.TableViewRowComparator(tableView));
>                 }
>             });
>         }
>     	
>     	public void add(T... ts) {
>     		for (T t: ts) {
>     			getTableData().add(t);
>     		}
>     	}
>     	
>     	static String getCapitalName(String name) {
>     		if (name.length() == 0) return name;
>     		return Character.toUpperCase(name.charAt(0))+name.substring(1);
>     	}
>     }
>     
>     static java.util.List<OlympicStanding> createOlympicStandings() throws Exception
{
>         java.util.List<OlympicStanding> ts = new java.util.ArrayList<OlympicStanding>();
>         
>         // tableViewSortListeners(): LISTENER_LIST_PROPERTY
>         ts.add(new OlympicStanding() {{
>             setNation("China");
>             setGold(51);
>             setSilver(21);
>             setBronze(28);
>             setFlag(new URL("file:/share/workspace/pivot/tutorials/src/org/apache/pivot/tutorials/tableviews/cn.png"));
>         }}); // INSTANCE, name: <tableviews:OlympicStanding>
>         ts.add(new OlympicStanding() {{
>             setNation("United States");
>             setGold(36);
>             setSilver(38);
>             setBronze(36);
>             setFlag(new URL("file:/share/workspace/pivot/tutorials/src/org/apache/pivot/tutorials/tableviews/us.png"));
>         }}); // INSTANCE, name: <tableviews:OlympicStanding>
>         return ts;
> 	}
>     	
>     static Window create() throws Exception {
>         return new Window() {{
>             final Map<String, Object> namespace = new HashMap<String, Object>();
>             setTitle("Table Views");
>             setMaximized(true);
>             setContent(new Border() {{
>                 setContent(new ScrollPane() {{
>                     setHorizontalScrollBarPolicy(ScrollPane.ScrollBarPolicy.FILL);
>                     setView(new GenericTableView<OlympicStanding>(OlympicStanding.class,
namespace){{
>                         namespace.put("tableView", this);
>                         
>                         for (OlympicStanding os: createOlympicStandings()) {
>                     		add(os);
>                     	}
>                     }}); // INSTANCE, name: <TableView>
>                     // columnHeader(): WRITABLE_PROPERTY
>                     setColumnHeader(new TableViewHeader() {{
>                         setTableView((TableView)namespace.get("tableView"));
>                         setSortMode(TableViewHeader.SortMode.MULTI_COLUMN);
>                     }}); // INSTANCE, name: <TableViewHeader>
>                 }}); // INSTANCE, name: <ScrollPane>
>             }}); // INSTANCE, name: <Border>
>             CodeEmitterRuntime.initialize(this, namespace);
>         }};
>     }
> 
>  
> 
> > I wondered if Pivot is really designed to support normal Java class based GUI implementation.
> 
> It most certainly is.  :-)  BXML is just a shortcut to coding your UI by hand. Anything
you can do in BXML, you can do in Java (though, in many cases, not quite as conveniently).
> 
> > Regarding to the translator, since there is no detail sample how to use these Java
API directly, it would be helpful if we have such bxml to Java translator.
> > But ideally, Pivot site should include more detailed sample/explanation for Java
Pivot API based approach(without bxml). Then we would not need such a tool.
> 
> If you read the BXML Primer, you should have a good understanding of how BXML maps to
Java. There's no magic to it - it is very straightforward.
> 
> > Also if we may really have declarative GUI design, using Scala may be more attractive
way. Scala would allow declaring GUI in equivalent code side as BXML.
> 
> I'm not sure how this would work. Scala is conceptually more akin to Java than markup.
Could you elaborate?
> 
> > BTW, I still wonder where the following code went wrong.  I would appreciate your
suggestion for the following code(java verson of custom_table_view.bxml).
> > When it is run, it opens the applet window, but it does not show anything.
> 
> Two errors:
> 
> - You need to call border.setContent(scrollPane), not border.add(scrollPane).
> 
> - You need to call scrollPane.setView(tableView). Otherwise, the scroll pane won't know
what it's content is.
> 
> I made these changes and the app worked fine.
> 
> G
> 
> 
> 
> 
> 
> -- 
> Cheers,
> calathus
> 
> 
> 
> 


Mime
View raw message