Binding properties of a root node and using fx:include.
I posted a downloadable example of this here:
https://dl.dropboxusercontent.com/u/8788282/binding-test.zip
I've noticed some understandable, but less than perfect behaviour with the way FXML initialization is done when using fx:include. I find it's difficult to bind properties that belong to the root node of the included view without shooting yourself in the proverbial foot. Here is an example of what I mean:
sample.Main
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("MainView.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
public static void main(String[] args) {
launch(args);
sample.MainController
package sample;
import javafx.fxml.FXML;
public class MainController {
@FXML
void initialize() {
System.out.println("MainController initialized.");
sample.MainView (FXML)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="200.0" prefWidth="200.0"
xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/2.2"
fx:controller="sample.MainController">
<children>
<VBox prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0"
AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0">
<children>
<Label text="Main"/>
<StackPane prefHeight="150.0" prefWidth="200.0"/>
<fx:include fx:id="sub" source="SubView.fxml" visible="false"/>
</children>
</VBox>
</children>
</AnchorPane>
sample.SubController
package sample;
import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
public class SubController {
@FXML
private AnchorPane anchorPane;
@FXML
private Label label;
@FXML
void initialize() {
label.visibleProperty().bind(Bindings.createBooleanBinding(() -> true));
/* When used as part of an fx:include, this controller's initialize()
* block is called and the below binding is performed. After that, any
* property values set via the containing view (MainView) are applied.
* In this example, the MainView attempts to set the visible property
* of this included view (fx:id="sub"). Since the visible property of
* the root node (anchorPane) has already been bound, the error
* "A bound value cannot be set." is given.
anchorPane.visibleProperty().bind(Bindings.createBooleanBinding(() -> true));
System.out.println("SubController initialized.");
sample.SubView (FXML)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" fx:id="anchorPane" maxHeight="-Infinity"
maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
prefHeight="400.0" prefWidth="600.0"
xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/2.2"
fx:controller="sample.SubController">
<children>
<VBox prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0"
AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0">
<children>
<Label fx:id="label" text="sub view"/>
</children>
</VBox>
</children>
</AnchorPane>
The comments in the initialize method of SubController explain what's happening. I found it a bit confusing until I figured out what was going on. Should FXMLLoader be checking to see if a property is already bound before trying to set it, at least for nodes declared via fx:include?
Hi Gaurave,
We need to show the report like this to some users, thats what the requirement is. Using the Posted nodes option does not help.
Thanks.
Similar Messages
-
How to Create Instances in the Transient Root Node and Sub Nodes from Root Node Query Method ?
Hi All,
I am Creating a BOPF BO with 3 Nodes,
Node 1) ROOT -- > contains a query,
using Root Node I have created Search UIBB Configuration in FBI.
In testing -- > when i enter Data in the Search Criteria Fields am able to get the details in to the query method
from Imporing parameter : 'IT_SELECTION_PARAMETERS'.
HERE I am fetching data from a standard table and trying to fill the data in the Node : 'MNR_SEARCH_RESULT'.
How to Append data to the Sub node 'MNR_SEARCH_RESULT' when there is no Node instance created in the ROOT Node ?
For This I have created an instance in the ROOT Node and Using that I tried to create Instance in the Sub Node 'MNR_SEARCH_RESULT'.
Below is my code which i have placed in the Query method ..
DATA : LR_DATA TYPE REF TO ZBO_S_ROOT1.
DATA : LR_SEARCH_RES TYPE REF TO ZBO_S_MNR_SEARCH_RESULT.
DATA : LO_CI_SERVICE_MANAGER TYPE REF TO /BOBF/IF_TRA_SERVICE_MANAGER,
LO_TRANSACTION_MANAGER TYPE REF TO /BOBF/IF_TRA_TRANSACTION_MGR.
LO_CI_SERVICE_MANAGER = /BOBF/CL_TRA_SERV_MGR_FACTORY=>GET_SERVICE_MANAGER( IV_BO_KEY = ZIF_BO_TEST_PO_C=>SC_BO_KEY ).
LO_TRANSACTION_MANAGER = /BOBF/CL_TRA_TRANS_MGR_FACTORY=>GET_TRANSACTION_MANAGER( ).
CREATE DATA LR_DATA.
LR_DATA->KEY = LO_CI_SERVICE_MANAGER->GET_NEW_KEY( ).
LR_DATA->ROOT_KEY = IS_CTX-ROOT_NODE_KEY.
LR_DATA->PIPO_MAT_ID = '100100'.
LR_DATA->PIPO_MAT_DESC = 'MATERIAL'.
LR_DATA->PIPO_SPRAS = 'E'.
LR_DATA->PIPO_MATL_TYPE = 'ZPMI'.
LR_DATA->PIPO_MATL_GROUP = 'ZKK'.
DATA lt_mod TYPE /bobf/t_frw_modification.
DATA lo_change TYPE REF TO /bobf/if_tra_change.
DATA lo_message TYPE REF TO /bobf/if_frw_message.
FIELD-SYMBOLS: <ls_mod> LIKE LINE OF lt_mod.
APPEND INITIAL LINE TO lt_mod ASSIGNING <ls_mod> .
<ls_mod>-node = ZIF_BO_TEST_PO_C=>sc_node-ROOT.
<ls_mod>-change_mode = /bobf/if_frw_c=>sc_modify_create.
<ls_mod>-key = LR_DATA->KEY.
<ls_mod>-data = LR_DATA.
DATA : LT_CHG_FIELDS TYPE /BOBF/T_FRW_NAME.
DATA : LS_CHG_FIELDS LIKE LINE OF LT_CHG_FIELDS.
DATA : LV_KEY TYPE /BOBF/CONF_KEY.
CALL METHOD IO_MODIFY->CREATE
EXPORTING
IV_NODE = ZIF_BO_TEST_PO_C=>sc_node-ROOT
IV_KEY = LR_DATA->KEY
IS_DATA = LR_DATA
IV_ROOT_KEY = IS_CTX-ROOT_NODE_KEY
IMPORTING
EV_KEY = LV_KEY .
CREATE DATA LR_SEARCH_RES.
LR_SEARCH_RES->KEY = LO_CI_SERVICE_MANAGER->GET_NEW_KEY( )..
LR_SEARCH_RES->PARENT_KEY = LV_KEY.
LR_SEARCH_RES->ROOT_KEY = LV_KEY.
LR_SEARCH_RES->MATNR = '123'.
LR_SEARCH_RES->ERSDA = SY-DATUM.
LR_SEARCH_RES->ERNAM = SY-UNAME.
**LR_SEARCH_RES->LAEDA = .
**LR_SEARCH_RES->AENAM = .
**LR_SEARCH_RES->VPSTA = .
*LR_SEARCH_RES->LVORM = .
LR_SEARCH_RES->MTART = 'ZPI'.
LR_SEARCH_RES->MBRSH = 'ZTP' .
LR_SEARCH_RES->MATKL = 'MAT'.
**LR_SEARCH_RES->BISMT = ''
**LR_SEARCH_RES->MEINS =
CALL METHOD io_modify->create
EXPORTING
iv_node = ZIF_BO_TEST_PO_C=>sc_node-MNR_SEARCH_RESULT
is_data = LR_SEARCH_RES
iv_assoc_key = ZIF_BO_TEST_PO_C=>sc_association-root-MNR_SEARCH_RESULT
iv_source_node_key = ZIF_BO_TEST_PO_C=>sc_node-root
iv_source_key = LV_KEY
iv_root_key = LV_KEY.
I am Unable to set data to the Node . I did not get any error message or Dump while executing . when i tried to retrive data I got the details from the node but am unable to view those details in the FBI UI and BOBT UI while testing .
Please provide your valuable Suggestions.
Thanks in Adv.
Thanks ,
Kranthi Kumar M.Hi Kranthi,
For your requirement you need only two nodes. Root Node and Result node. Use the same structure for both.
To create Instance while search.
Create Query method with input type which has the required fields for selection criteria.
Fetch the data and create instance in the root node.
Pass the new instance key as exporting parameter form Query Method.
To Move data from ROOT to Result.
Create a action at root node.
Write a code to create new entries in Result node.
Then configure the Search UIBB and display result in List UIBB. Add button and assign the action MOVE_MAT_2_RESULT.
Create another List uibb to display data from Result node.
Connect the UIBBs using wire schema. SEARCH -> LIST(ROOT) ---> LIST(RESULT).
Give src node association for ROOT to RESULT Configuration.
Regards,
Sunil -
Lining up root node and child nodes in JTree
I have a JTree that has a root node and n child nodes. There are no sub-levels - it is structured just like AOL instant messenger. What I want to do is have the child node icons line up directly under the root nodes text. For example (if you can read this), where "-" denotes the icon:
- root
- child
- child
Currently it is something like this:
- root
- child
- child
I have been messing with the setLeftChildIndent( int ) and setRightChildIndent( int ), but they are not doing much...they seem to not want to only move the leaf nodes but all of the nodes, so its not doing exactly what I want.
Any ideas? In the meantime I'll be looking more into how exactly those indent mutators work.
Thanks!What you want is to do a setRootVisible(false) on the JTree.
All your child nodes are then your "root level" folders.
tree.setRootVisible(true):
+root
+--child1
+--child2
+--child3
+----child3a
+----child3btree.setRootVisible(false):
+child1
+child2
+child3
+--child3a
+--child3b -
Add a root node and namespace declaration
According to the requirement,I have a large appended .txt file.
This .txt file is created by appending various xml files (without the namespace and root node).
I need to add a root node and namespace declaration to the large appended .txt file so that it can be read as .xml.
Please provide the pointers for the same.
Thanks & Regards,
RashiMy appended file looks like following.
<input>
<Store>
<StoreHeader>
<StoreNbr>56</StoreNbr>
<StoreType>Retail</StoreType>
<StoreSite>2004</StoreSite>
</StoreHeader>
<Transactions>
<Transaction>
<Item>A</Item>
<ItemPrice>4</ItemPrice>
</Transaction>
<Transaction>
<Item>C</Item>
<ItemPrice>56</ItemPrice>
</Transaction>
</Transactions>
</Store>
</input>
<input>
<Store>
<StoreHeader>
<StoreNbr>123</StoreNbr>
<StoreType>Retail</StoreType>
<StoreSite>2004</StoreSite>
</StoreHeader>
<Transactions>
<Transaction>
<Item>A</Item>
<ItemPrice>4</ItemPrice>
</Transaction>
<Transaction>
<Item>B</Item>
<ItemPrice>8</ItemPrice>
</Transaction>
<Transaction>
<Item>C</Item>
<ItemPrice>56</ItemPrice>
</Transaction>
</Transactions>
</Store>
</input>
Now according to the requirement, I need to add namespace and root node and make it like follows:
<ns0:output xmlns:ns0="http://xxx">
<input>
<Store>
<StoreHeader>
<StoreNbr>56</StoreNbr>
<StoreType>Retail</StoreType>
<StoreSite>2004</StoreSite>
</StoreHeader>
<Transactions>
<Transaction>
<Item>A</Item>
<ItemPrice>4</ItemPrice>
</Transaction>
<Transaction>
<Item>C</Item>
<ItemPrice>56</ItemPrice>
</Transaction>
</Transactions>
</Store>
</input>
<input>
<Store>
<StoreHeader>
<StoreNbr>123</StoreNbr>
<StoreType>Retail</StoreType>
<StoreSite>2004</StoreSite>
</StoreHeader>
<Transactions>
<Transaction>
<Item>A</Item>
<ItemPrice>4</ItemPrice>
</Transaction>
<Transaction>
<Item>B</Item>
<ItemPrice>8</ItemPrice>
</Transaction>
<Transaction>
<Item>C</Item>
<ItemPrice>56</ItemPrice>
</Transaction>
</Transactions>
</Store>
</input>
</ns0:output> -
Create root node and child nodes while downloading data from internal table
Hi all,
i have to down load the details of three materials present in the internal table into
a XML file, the material number must be the root node, ERNAM,AENAM,VPSTA
fields must be its child nodes. in this way i have to display details of three
materials like material1,material2,material3.
how can i do that in 4.6c version.
Thanks,
satish.Hi Satish,
Please look into the following programs. These are sample SAP programs to deal with XML in 46c.
BCCIIXMLT1
BCCIIXMLT2
BCCIIXMLT3
Hope these will helps,
Sumant. -
XSU XSLT and using xsl:include href=""
I'm runing XDK 9.2 on an 8.1.7.4 database. I'm trying to transform the output of the XSU into a flat text file using a set of XSLT files. The main xslt includes the other xslt template files and then calls their templates by name as needed for different types of data in the XSU output.
I have the main xslt in a table of BFILEs that I read from and pass to the DBMS_XMLQUERY.SETXSLT procedure as a CLOB. I get the following errors when I run the main procedure to generate the flat text file:
oracle.xml.sql.OracleXMLSQLException: <Line 41, Column 35>: XSL-1002: (Error) Error while processing include XSL file (header.xslt).
at oracle.xml.sql.query.OracleXMLQuery.setXSLT(OracleXMLQuery.java:818)
at oracle.xml.sql.query.OracleXMLStaticQuery.setXSLT(OracleXMLStaticQuery.java:481)
"header.xslt" is one of the included xslts. Is there some way to specify the other xslts? I have tried loading them into the BFILE table, but it still doesn't work.Hi I have tried out the code i.e. transforming a node and getting out a string representation. Following is code that works using JAXP apis.
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;
public class XMLString {
public void xmlInString(Document document) throws Exception{
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer =
tf.newTransformer();
StringWriter stWriter = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(stWriter));
String strDOM = stWriter.toString();
System.out.println("String dom");
StringReader strIn = new StringReader(strDOM);
BufferedReader buffIn = new BufferedReader(strIn);
BufferedWriter bufOut = new BufferedWriter(new FileWriter("out.txt"));
String out = null;
while((out=buffIn.readLine()) != null){
bufOut.write(out, 0, out.length());
bufOut.flush();
bufOut.close();
public static void main(String args[]){
try{
XMLString strXML = new XMLString();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource inputSource = new InputSource("input.xml");
Document doc = db.parse(inputSource);
strXML.xmlInString(doc);
}catch(Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
I am using the xalan and xerces versions that come with the Java XML Winter pack from sun's website. The problem could lie with the underlying transformation processor you are using. It may not support transforming to a string or it could have a bug. So my advice is to find out what version transformation processor you are using. And look at the vendor's documentation to find any reference to this feature. Otherwise try using the Java XML Winter pack. -
How can load properties file for one time and use in entire application
Hi folks,
I dont want to read properties file every time , and want to get property value in any servelet or jsp page.(means i want to read only property file only for once and want to get value in any where ) , how to do this.
Message was edited by:
RajeshwarReddyTmeans we have to read file every time Know but i dont
want to be happen that ??? No you don't . You read the file once. You store it in the hashmap. Then you hand that hashmap to whatever class needing the data.
getProperties() returns the hashmap, doesn't read the file.
Maybe I should have called the method getMap or something.
Message was edited by:
karma-9 -
Adding Node and Deleting Node in Tree
Hi,
I am building a tree dynamically.
I have a class which has set of properties.I am constructing as follows.
public class TreeNode
public function TreeNode()
public var friendlyName:String;
public var icon:Class;
[Bindable]
public var children : Array;
public var logicalName:String;
public var neType:String;
[Bindable]
public var arrayColl:ArrayCollection = new ArrayCollection();
public function addChild(node:TopoTreeNode):void
if (this.children == null){
this.children = new Array();
children.push(node);
arrayColl.source = children;
public function clearChild():void
children = null;
public function removeChild(arrayIndex:int):void
if(children != null)
children.splice(arrayIndex,1);
arrayColl.source = children;
Then I set the dataProvider as follows where treeModel is object that is injected.
<mx:Tree id="tree"
dataProvider="{treeModel.rootNode.arrayColl}"
labelFunction="{treeModel.getDisplayName}"
iconFunction="{treeModel.setIcon}"
width="100%"
height="95%"
rowCount="6"
showScrollTips="true" showDataTips="true" dataTipFunction="{treeModel.getDisplayName}" allowMultipleSelection="true" click="treeModel.displayItemInWorkingView(tree.selectedItems);"/>
TreeModel has the following variables
[Bindable]
public var rootNode:TopoTreeNode = new TopoTreeNode(); // this is the rootNode.
[Bindable]
public var rootChild:TopoTreeNode = new TopoTreeNode(); // this is the child of the root node..
While constructing the tree, it is working fine.
But after this when i try to add a node (ie adding a node as child to rootNode), it is getting added to my rootNode object but it is not getting displayed
When i click on the items in the tree or click on the drop menu in the tree it is getting displayed.
But i want it to be shown in the tree without clicking anything.
Could anyone help on this?
Regards
SriniOff the top of my head, you need to call a refresh of some sort, or executeBindings()... something like that.
You will also need to start at the root node and expand any parent branches down to the new leaf.
If you are still having trouble after looking into that, I can try and dig through some of old code and find my solution. -
Mapping Templates creation and use
Hi All,
I am trying to use mapping templates.
I am trying to create mapping templates from a message mapping .
But "Create Template Based On Mapping" option is disable here.
So how can I create mapping templates?
Again how to use that template?
Any kind of suggestion will be appreciated.
Thanks
RabiSelect source root node and target root node. Then right cliek and choose the option "Create Template based on mapping" on the target section.
Refer this link
http://wiki.sdn.sap.com/wiki/display/XI/MappingtemplatesinPI7 -
Validation to find the Root Node !!!!
Hi All,
Is it possible to write a Validation to find the Root Node of the Hierarchy,
For E.g. If we have a three level hierarchy
Printer
Dot Matrix
T123
So is there a way I can check if my Root node value is Printer or not, because in Data Manager the value that is selected from the hierarchy drop down is the leaf node.
Regards,
ParulHi Jitesh,
The solution is as follows:
MDM does not give us the option to traverse to the grandparent of the leaf node..
In the example that we have taken :
Printer
- Dot Matrix
- Laser
--Laser1
--Laser2
Here if we want to check if the Grandparent of Laser1 is Printer, this cannot be done using the simple Validation, because through validation also we can at max find the parent of the current node i.e. we can traverse till Laser (for Laser 1 leaf node).
Further we cannot use Laser as the node because in MDM we have to traverse completely through the last node and select it in Data Manager. So again we cannot search for Laser -> Parent.
The Work Around that I have used is :
I have created a new field and every time I import data I have mapped this field with the first Level Node and have put the Validation on this field.
Eg: The field name is Root Node, so everytime the data is imported, Level 1 is mapped to Root Node and so all the Root node values are imported in the Root Node field that we have created and everytime the Validation Runs on this Root Node field and accordingly the process follows.
Hope that would be helpful to you all!!!!
Regards,
Parul Malhotra -
Open XML and using xslt with JavaScript
Hello,
I want the user to be able to choose an XML-file. This XML-file should not be placed in InDesign, there is not even a document needed for my script. All I need is a variable, containing the file. However, the XML-file should be transformed with xslt into another XML-file. How do I do this?
This is how I open the first XML-file, the one that should be transformed:
var xmlDoc = File.openDialog ("Choose XML");
if (xmlDoc == null) {return;}
xmlDoc.open("r");
xmlDoc = xmlDoc.read();
xmlDoc = new XML(xmlDoc);
I can adress different nodes and use xmlDoc as an XML-file, so that's fine, but how do I transform it?
I read the Scripting Guide and tried this:
var myDocument = app.documents.add();
var myXMLImportPreferences = app.xmlImportPreferences;
myXMLImportPreferences.transformFilename = "c:\myTransform.xsl";
var xx = myDocument.importXML(File.openDialog ("XML"));
However, it's not exactly what I want since I have to create a document and it's not working either, since xx stays undefined.
Thanks for your help.You can't get exactly what you want.
Your first code example uses the InDesign JavaScript interpreter's XML support, called E4X. It has absolutely nothing to do with the InDesign document object model or InDesign's internal support for XML. It exists only within the JavaScript interpreter. It does not support XSLT transformations.
Your second example leverages InDesign's built-in XSLT support (I'm not too sure how this works...); but that is only useful when importing XML into
InDesign, which, as you have learned, requires a document.
In the first example, you could call out to an external invokation of xsltproc and read in the input. How to do that differs for Windows and Mac.
In the second example, you could export the XML from your Document back out to an XML file and read it back in with E4X.
None of this is very appealing. What do you really need to do? -
How to change icon of a node or root node of a JTree
i have a JTree with a root node, and leaf nodes. i want to change their icons. how can i do this?
thanksHere's a search of the forums with the words 'tree', 'icon' and 'node' in the title
http://onesearch.sun.com/search/developers/index.jsp?and=jtree+icon+node&nh=10&phr=&qt=¬=&field=title&since=&col=devforums&rf=0&Search.x=28&Search.y=15
I looked at a couple and #5 seems interesting, but there are quite a few to choose from. -
Need to Set Node Attribute using XPath
Hi,
I have an XMLType coloum, I Need to Set/Update/Remove Root Node Attribute using XPath query.
Regards,
RajeshHere you go:
Node nameNode =
(Node) XPathFactory.newInstance().newXPath().evaluate(
"/root/name", doc, XPathConstants.NODE);
nameNode.setTextContent("bob"); -
We are migrating databases to Exadata, and the existing databases use the invited nodes listener parameter to limit access. We will be connecting the Exadata to Exalogic middle tier nodes, and use SDP for best performance. Does invited nodes work the same way when using an SDP connection?
Thanks,
BrianI have never set anything like that up, but I don't see why it wouldn't work the same.
If you have serious questions like this, I recommend opening an SR with MOS to get the best answer.
- Wilson
www.michaelwilsondba.info -
Help with building a JTree using tree node and node renderers
Hi,
I am having a few problems with JTree's. basically I want to build JTree from a web spider. The webspide searches a website checking links and stores the current url that is being processed as a string in the variable msg. I wan to use this variable to build a JTree in a new class and then add it to my GUI. I have created a tree node class and a renderer node class, these classes are built fine. can someone point me in the direction for actually using these to build my tree in a seperate class and then displaying it in a GUI class?
*nodeRenderer.java
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.net.*;
public class nodeRenderer extends DefaultTreeCellRenderer
implements TreeCellRenderer
public static Icon icon= null;
public nodeRenderer() {
icon = new ImageIcon(getClass().getResource("icon.gif"));
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(
tree, value, sel,
expanded, leaf, row,
hasFocus);
treeNode node = (treeNode)(((DefaultMutableTreeNode)value).getUserObject());
if(icon != null) // set a custom icon
setOpenIcon(icon);
setClosedIcon(icon);
setLeafIcon(icon);
return this;
*treeNode.java
*this is the class to represent a node
import javax.swing.*;
import javax.swing.tree.*;
import java.util.*;
import java.net.*;
* Class used to hold information about a web site that has
* been searched by the spider class
public class treeNode
*Url from the WebSpiderController Class
*that is currently being processed
public String msg;
treeNode(String urlText)
msg = urlText;
String getUrlText()
return msg;
//gui.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class gui extends JFrame implements Runnable
*declare variable, boolean
*thread, a object and a center
*pane
protected URL urlInput;
protected Thread bgThread;
protected boolean run = false;
protected WebSpider webSpider;
public gui()
*create the gui here
setTitle("Testing Tool");
setSize(600,600);
//add Buttons to the tool bar
start.setText("Start");
start.setActionCommand("Start");
toolBar.add(start);
ButtonListener startListener = new ButtonListener();
start.addActionListener(startListener);
cancel.setText("Cancel");
cancel.setActionCommand("Cancel");
toolBar.add(cancel);
ButtonListener cancelListener = new ButtonListener();
cancel.addActionListener(cancelListener);
close.setText("Close");
close.setActionCommand("Close");
toolBar.add(close);
ButtonListener closeListener = new ButtonListener();
close.addActionListener(closeListener);
//creat a simple form
urlLabel.setText("Enter URL:");
urlLabel.setBounds(100,36,288,24);
formTab.add(urlLabel);
url.setBounds(170,36,288,24);
formTab.add(url);
current.setText("Currently Processing: ");
current.setBounds(100,80,288,24);
formTab.add(current);
//add scroll bars to the error messages screen and website structure
errorPane.setAutoscrolls(true);
errorPane.setHorizontalScrollBarPolicy(javax.swing.
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
errorPane.setVerticalScrollBarPolicy(javax.swing.
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
errorPane.setOpaque(true);
errorTab.add(errorPane);
errorPane.setBounds(0,0,580,490);
errorText.setEditable(false);
errorPane.getViewport().add(errorText);
errorText.setBounds(0,0,600,550);
treePane.setAutoscrolls(true);
treePane.setHorizontalScrollBarPolicy(javax.swing.
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
treePane.setVerticalScrollBarPolicy(javax.swing.
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
treePane.setOpaque(true);
treeTab.add(treePane);
treePane.setBounds(0,0,580,490);
treeText.setEditable(false);
treePane.getViewport().add(treeText);
treeText.setBounds(0,0,600,550);
//create the tabbed window
centerPane.setBorder(new javax.swing.border.EtchedBorder());
formTab.setLayout(null);
errorTab.setLayout(null);
treeTab.setLayout(null);
centerPane.addTab("Search Parameters", formTab);
centerPane.addTab("Error Messages", errorTab);
centerPane.addTab("Website Structure", treeTab);
//add the tool bar and tabbed pane
getContentPane().add(toolBar, java.awt.BorderLayout.NORTH);
getContentPane().add(centerPane, java.awt.BorderLayout.CENTER);
*create the tool bar pane, a center pane, add the buttons,
*labels, tabs, a text field for user input here
javax.swing.JPanel toolBar = new javax.swing.JPanel();
javax.swing.JButton start = new javax.swing.JButton();
javax.swing.JButton cancel = new javax.swing.JButton();
javax.swing.JButton close = new javax.swing.JButton();
javax.swing.JTabbedPane centerPane = new javax.swing.JTabbedPane();
javax.swing.JPanel formTab = new javax.swing.JPanel();
javax.swing.JLabel urlLabel = new javax.swing.JLabel();
javax.swing.JLabel current = new javax.swing.JLabel();
javax.swing.JTextField url = new javax.swing.JTextField();
javax.swing.JPanel errorTab = new javax.swing.JPanel();
javax.swing.JTextArea errorText = new javax.swing.JTextArea();
javax.swing.JScrollPane errorPane = new javax.swing.JScrollPane();
javax.swing.JPanel treeTab = new javax.swing.JPanel();
javax.swing.JTextArea treeText = new javax.swing.JTextArea();
javax.swing.JScrollPane treePane = new javax.swing.JScrollPane();
javax.swing.JTree searchTree = new javax.swing.JTree();
*show the gui
public static void main(String args[])
(new gui()).setVisible(true);
*listen for the button presses and set the
*boolean flag depending on which button is pressed
class ButtonListener implements ActionListener
public void actionPerformed(ActionEvent event)
Object object = event.getSource();
if (object == start)
run = true;
startActionPerformed(event);
if (object == cancel)
run = false;
startActionPerformed(event);
if (object == close)
System.exit(0);
*this method is called when the start or
*cancel button is pressed.
void startActionPerformed (ActionEvent event)
if (run == true && bgThread == null)
bgThread = new Thread(this);
bgThread.start();
if (run == false && bgThread != null)
webSpider.cancel();
*this mehtod will start the background thred.
*the background thread is required so that the
*GUI is still displayed
public void run()
try
webSpider = new WebSpider(this);
webSpider.clear();
urlInput = new URL(url.getText());
webSpider.addURL(urlInput);
webSpider.run();
bgThread=null;
catch (MalformedURLException e)
addressError addErr = new addressError();
addErr.addMsg = "URL ERROR - PLEASE CHECK";
SwingUtilities.invokeLater(addErr);
*this method is called by the web spider
*once a url is found. Validation of navigation
*happens here.
public boolean urlFound(URL urlInput,URL url)
CurrentlyProcessing pro = new CurrentlyProcessing();
pro.msg = url.toString();
SwingUtilities.invokeLater(pro);
if (!testLink(url))
navigationError navErr = new navigationError();
navErr.navMsg = "Broken Link "+url+" caused on "+urlInput+"\n";
return false;
if (!url.getHost().equalsIgnoreCase(urlInput.getHost()))
return false;
else
return true;
*this method is called internally to check
*that a link works
protected boolean testLink(URL url)
try
URLConnection connection = url.openConnection();
connection.connect();
return true;
catch (IOException e)
return false;
*this method is called when an error is
*found.
public void URLError(URL url)
*this method is called when an email
*address is found
public void emailFound(String email)
/*this method will update any errors found inc
*address errors and broken links
class addressError implements Runnable
public String addMsg;
public void run()
errorText.append(addMsg);
current.setText("Currently Processing: "+ addMsg);
class navigationError implements Runnable
public String navMsg;
public void run()
errorText.append(navMsg);
*this method will update the currently
*processing field on the GUI
class CurrentlyProcessing implements Runnable
public String msg;
public void run()
current.setText("Currently Processing: " + msg );
//webspider.java
import java.util.*;
import java.net.*;
import java.io.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.tree.*;
import javax.swing.*;
*this class implements the spider.
public class WebSpider extends HTMLEditorKit
*make a collection of the URL's
protected Collection urlErrors = new ArrayList(3);
protected Collection urlsWaiting = new ArrayList(3);
protected Collection urlsProcessed = new ArrayList(3);
//report URL's to this class
protected gui report;
*this flag will indicate whether the process
*is to be cancelled
protected boolean cancel = false;
*The constructor
*report the urls to the wui class
public WebSpider(gui report)
this.report = report;
*get the urls from the above declared
*collections
public Collection getUrlErrors()
return urlErrors;
public Collection getUrlsWaiting()
return urlsWaiting;
public Collection getUrlsProcessed()
return urlsProcessed;
* Clear all of the collections.
public void clear()
getUrlErrors().clear();
getUrlsWaiting().clear();
getUrlsProcessed().clear();
*Set a flag that will cause the begin
*method to return before it is done.
public void cancel()
cancel = true;
*add the entered url for porcessing
public void addURL(URL url)
if (getUrlsWaiting().contains(url))
return;
if (getUrlErrors().contains(url))
return;
if (getUrlsProcessed().contains(url))
return;
/*WRITE TO LOG FILE*/
log("Adding to workload: " + url );
getUrlsWaiting().add(url);
*process a url
public void processURL(URL url)
try
/*WRITE TO LOGFILE*/
log("Processing: " + url );
// get the URL's contents
URLConnection connection = url.openConnection();
if ((connection.getContentType()!=null) &&
!connection.getContentType().toLowerCase().startsWith("text/"))
getUrlsWaiting().remove(url);
getUrlsProcessed().add(url);
log("Not processing because content type is: " +
connection.getContentType() );
return;
// read the URL
InputStream is = connection.getInputStream();
Reader r = new InputStreamReader(is);
// parse the URL
HTMLEditorKit.Parser parse = new HTMLParse().getParser();
parse.parse(r,new Parser(url),true);
catch (IOException e)
getUrlsWaiting().remove(url);
getUrlErrors().add(url);
log("Error: " + url );
report.URLError(url);
return;
// mark URL as complete
getUrlsWaiting().remove(url);
getUrlsProcessed().add(url);
log("Complete: " + url );
*start the spider
public void run()
cancel = false;
while (!getUrlsWaiting().isEmpty() && !cancel)
Object list[] = getUrlsWaiting().toArray();
for (int i=0;(i<list.length)&&!cancel;i++)
processURL((URL)list);
* A HTML parser callback used by this class to detect links
protected class Parser extends HTMLEditorKit.ParserCallback
protected URL urlInput;
public Parser(URL urlInput)
this.urlInput = urlInput;
public void handleSimpleTag(HTML.Tag t,MutableAttributeSet a,int pos)
String href = (String)a.getAttribute(HTML.Attribute.HREF);
if((href==null) && (t==HTML.Tag.FRAME))
href = (String)a.getAttribute(HTML.Attribute.SRC);
if (href==null)
return;
int i = href.indexOf('#');
if (i!=-1)
href = href.substring(0,i);
if (href.toLowerCase().startsWith("mailto:"))
report.emailFound(href);
return;
handleLink(urlInput,href);
public void handleStartTag(HTML.Tag t,MutableAttributeSet a,int pos)
handleSimpleTag(t,a,pos); // handle the same way
protected void handleLink(URL urlInput,String str)
try
URL url = new URL(urlInput,str);
if (report.urlFound(urlInput,url))
addURL(url);
catch (MalformedURLException e)
log("Found malformed URL: " + str);
*log the information of the spider
public void log(String entry)
System.out.println( (new Date()) + ":" + entry );
I have a seperate class for parseing the HTML. Any help would be greatly appreciated
mrvHi Sorry to be a pain again,
I have re worked the gui class so it looks like this now:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class gui extends JFrame implements Runnable
*declare variable, boolean
*thread, a object and a center
*pane
protected URL urlInput;
protected Thread bgThread;
protected boolean run = false;
protected WebSpider webSpider;
public String msgInfo;
public String brokenUrl;
public String goodUrl;
public String deadUrl;
protected DefaultMutableTreeNode rootNode;
protected DefaultTreeModel treeModel;
public gui()
*create the gui here
setTitle("Testing Tool");
setSize(600,600);
//add Buttons to the tool bar
start.setText("Start");
start.setActionCommand("Start");
toolBar.add(start);
ButtonListener startListener = new ButtonListener();
start.addActionListener(startListener);
cancel.setText("Cancel");
cancel.setActionCommand("Cancel");
toolBar.add(cancel);
ButtonListener cancelListener = new ButtonListener();
cancel.addActionListener(cancelListener);
close.setText("Close");
close.setActionCommand("Close");
toolBar.add(close);
ButtonListener closeListener = new ButtonListener();
close.addActionListener(closeListener);
//creat a simple form
urlLabel.setText("Enter URL:");
urlLabel.setBounds(100,36,288,24);
formTab.add(urlLabel);
url.setBounds(170,36,288,24);
formTab.add(url);
current.setText("Currently Processing: ");
current.setBounds(100,80,288,24);
formTab.add(current);
//add scroll bars to the error messages screen and website structure
errorPane.setAutoscrolls(true);
errorPane.setHorizontalScrollBarPolicy(javax.swing.
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
errorPane.setVerticalScrollBarPolicy(javax.swing.
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
errorPane.setOpaque(true);
errorTab.add(errorPane);
errorPane.setBounds(0,0,580,490);
errorText.setEditable(false);
errorPane.getViewport().add(errorText);
errorText.setBounds(0,0,600,550);
treePane.setAutoscrolls(true);
treePane.setHorizontalScrollBarPolicy(javax.swing.
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
treePane.setVerticalScrollBarPolicy(javax.swing.
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
treePane.setOpaque(true);
treeTab.add(treePane);
treePane.setBounds(0,0,580,490);
treeText.setEditable(false);
treePane.getViewport().add(treeText);
treeText.setBounds(0,0,600,550);
//JTree
// NEW CODE
rootNode = new DefaultMutableTreeNode("Root Node");
treeModel = new DefaultTreeModel(rootNode);
treeModel.addTreeModelListener(new MyTreeModelListener());
tree = new JTree(treeModel);
tree.setEditable(true);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(true);
treeText.add(tree);
//create the tabbed window
centerPane.setBorder(new javax.swing.border.EtchedBorder());
formTab.setLayout(null);
errorTab.setLayout(null);
treeTab.setLayout(null);
centerPane.addTab("Search Parameters", formTab);
centerPane.addTab("Error Messages", errorTab);
centerPane.addTab("Website Structure", treeTab);
//add the tool bar and tabbed pane
getContentPane().add(toolBar, java.awt.BorderLayout.NORTH);
getContentPane().add(centerPane, java.awt.BorderLayout.CENTER);
*create the tool bar pane, a center pane, add the buttons,
*labels, tabs, a text field for user input here
javax.swing.JPanel toolBar = new javax.swing.JPanel();
javax.swing.JButton start = new javax.swing.JButton();
javax.swing.JButton cancel = new javax.swing.JButton();
javax.swing.JButton close = new javax.swing.JButton();
javax.swing.JTabbedPane centerPane = new javax.swing.JTabbedPane();
javax.swing.JPanel formTab = new javax.swing.JPanel();
javax.swing.JLabel urlLabel = new javax.swing.JLabel();
javax.swing.JLabel current = new javax.swing.JLabel();
javax.swing.JTextField url = new javax.swing.JTextField();
javax.swing.JPanel errorTab = new javax.swing.JPanel();
javax.swing.JTextArea errorText = new javax.swing.JTextArea();
javax.swing.JScrollPane errorPane = new javax.swing.JScrollPane();
javax.swing.JPanel treeTab = new javax.swing.JPanel();
javax.swing.JTextArea treeText = new javax.swing.JTextArea();
javax.swing.JScrollPane treePane = new javax.swing.JScrollPane();
javax.swing.JTree tree = new javax.swing.JTree();
*show the gui
public static void main(String args[])
(new gui()).setVisible(true);
*listen for the button presses and set the
*boolean flag depending on which button is pressed
class ButtonListener implements ActionListener
public void actionPerformed(ActionEvent event)
Object object = event.getSource();
if (object == start)
run = true;
startActionPerformed(event);
if (object == cancel)
run = false;
startActionPerformed(event);
if (object == close)
System.exit(0);
*this method is called when the start or
*cancel button is pressed.
void startActionPerformed (ActionEvent event)
if (run == true && bgThread == null)
bgThread = new Thread(this);
bgThread.start();
//new line of code
treeText.addObject(msgInfo);
if (run == false && bgThread != null)
webSpider.cancel();
*this mehtod will start the background thred.
*the background thread is required so that the
*GUI is still displayed
public void run()
try
webSpider = new WebSpider(this);
webSpider.clear();
urlInput = new URL(url.getText());
webSpider.addURL(urlInput);
webSpider.run();
bgThread = null;
catch (MalformedURLException e)
addressError addErr = new addressError();
addErr.addMsg = "URL ERROR - PLEASE CHECK";
SwingUtilities.invokeLater(addErr);
*this method is called by the web spider
*once a url is found. Validation of navigation
*happens here.
public boolean urlFound(URL urlInput,URL url)
CurrentlyProcessing pro = new CurrentlyProcessing();
pro.msg = url.toString();
SwingUtilities.invokeLater(pro);
if (!testLink(url))
navigationError navErr = new navigationError();
navErr.navMsg = "Broken Link "+url+" caused on "+urlInput+"\n";
brokenUrl = url.toString();
return false;
if (!url.getHost().equalsIgnoreCase(urlInput.getHost()))
return false;
else
return true;
*this method is returned if there is no link
*on a web page, e.g. there us a dead end
public void urlNotFound(URL urlInput)
deadEnd dEnd = new deadEnd();
dEnd.dEMsg = "No links on "+urlInput+"\n";
deadUrl = urlInput.toString();
*this method is called internally to check
*that a link works
protected boolean testLink(URL url)
try
URLConnection connection = url.openConnection();
connection.connect();
goodUrl = url.toString();
return true;
catch (IOException e)
return false;
*this method is called when an error is
*found.
public void urlError(URL url)
*this method is called when an email
*address is found
public void emailFound(String email)
/*this method will update any errors found inc
*address errors and broken links
class addressError implements Runnable
public String addMsg;
public void run()
current.setText("Currently Processing: "+ addMsg);
errorText.append(addMsg);
class navigationError implements Runnable
public String navMsg;
public void run()
errorText.append(navMsg);
class deadEnd implements Runnable
public String dEMsg;
public void run()
errorText.append(dEMsg);
*this method will update the currently
*processing field on the GUI
public class CurrentlyProcessing implements Runnable
public String msg;
//new line
public String msgInfo = msg;
public void run()
current.setText("Currently Processing: " + msg );
* NEW CODE
* NEED THIS CODE SOMEWHERE
* treeText.addObject(msgInfo);
public DefaultMutableTreeNode addObject(Object child)
DefaultMutableTreeNode parentNode = null;
TreePath parentPath = tree.getSelectionPath();
if (parentPath == null)
parentNode = rootNode;
else
parentNode = (DefaultMutableTreeNode)
(parentPath.getLastPathComponent());
return addObject(parentNode, child, true);
public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child)
return addObject(parent, child, false);
public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child,boolean shouldBeVisible)
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);
if (parent == null)
parent = rootNode;
treeModel.insertNodeInto(childNode, parent, parent.getChildCount());
if (shouldBeVisible)
tree.scrollPathToVisible(new TreePath(childNode.getPath()));
return childNode;
public class MyTreeModelListener implements TreeModelListener
public void treeNodesChanged (TreeModelEvent e)
DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode)
(e.getTreePath().getLastPathComponent());
try
int index = e.getChildIndices()[0];
node = (DefaultMutableTreeNode)
(node.getChildAt(index));
catch (NullPointerException exc)
public void treeNodesInserted(TreeModelEvent e)
public void treeStructureChanged(TreeModelEvent e)
public void treeNodesRemoved(TreeModelEvent e)
I beleive that this line of code is required:
treeText.addObject(msgInfo);
I have placed it where the action events start the spider, but i keep getting this error:
cannot resolve symbol
symbol : method addObject (java.lang.String)
location: class javax.swing.JTextArea
treeText.addObject(msgInfo);
Also the jtree is not showing the window that I want it to and I am not too sure why. could you have a look to see why? i think it needs a fresh pair of eyes.
Many thanks
MrV
Maybe you are looking for
-
Query Help: http://forum.java.sun.com/thread.jsp?forum=45&thread=471180&tstart=15&trange=15 It seems I have confused enough people with my improper presentation of query. Sorry guys. I will restate my question with different table names. The above wa
-
ITunes 10.6.3 not importing mp3 files but will play the mp3 files
Hi I recently updated my iTunes to v10.6.3 on my mac. However, I cant seem to add new music to my iTunes library. Dropping and dragging doesnt work even though the '+' curser appears and importing music using command + O doesnt work either. There is
-
How to use the cgicmd.dat to specify a directory name for desname
Hi folks, What I'm trying to do is use a command key to specify the directory for a file, specified via desname. Here's an example. cgicmd.dat custom_reports_dir: /some/directory/custom_reports Then I want to reference it via something like this.. ht
-
Searching insert or update action
Hi, i'm searching the update and insert action of a table. We've an oracle database dump from someone else and now we want to now how a special table is been filled. How can i discover this? Thanks in advance. Regards Nicole
-
Quiz, Retake quiz,
Hi all! My course has several practice ungraded questions, a real test (9 graded questions), and an "after course" reportable survey (8 questions). I want students to be able to retake the quiz once. The Quiz Results slide now automatically appears