Mengubah ICON pada JTree di JAVA

Mengubah ICON pada JTree di JAVA

Hehe, keliatannya sederhana yak tapi dah bikin gua pusing ampek dua hari, makanya diposting biar puas. Haaahhh, yes..!. hehe ini ekspresi gua waktu berhasil nyelesain.
Ok gak usah ba bi bu, lansung aja nanti tampilannya akan seperti ini sudara:


Nah pertama kita harus bikin data dulu, misal:
public void createNode(DefaultMutableTreeNode root) {
DefaultMutableTreeNode node = null;
DefaultMutableTreeNode client = null;

node = new DefaultMutableTreeNode(“Node Jaringan 1”);
root.add(node);
client = new DefaultMutableTreeNode(“Client 1”);
node.add(client);
client = new DefaultMutableTreeNode(“Client 2”);
node.add(client);

node = new DefaultMutableTreeNode(“Node Jaringan 2”);
root.add(node);
client = new DefaultMutableTreeNode(“Client 1”);
node.add(client);

}

Ok habis punya data yang akan kita buat tree sekarang kita renderer ulang tampilan si JTree yang sudah difault oleh JVMnya Java.
public void setChangeTree(JTree tree){
ImageIcon leafIcon = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/user-24.png”));
ImageIcon leafIconOff = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/Alert-24.png”));
ImageIcon openIcon = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/node_online_24.png”));
ImageIcon closeIcon = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/node_online_24.png”));
ImageIcon openIconOff = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/node_offline_24.png”));
ImageIcon closeIconOff = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/node_offline_24.png”));

// Update only one tree instance
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer();
renderer.setLeafIcon(leafIconOff);
renderer.setOpenIcon(openIconOff);
renderer.setClosedIcon(closeIcon);
tree.setCellRenderer(renderer);

// Create tree with new icons
tree = new JTree();

}

Bila kedua syarat udah dilakukan tinggal pakai aja, simple kan. Jadi nyadar lagi nih, mengapa orang berpengalaman itu lebih mahal dari pada pemula huhu😛.
private void formWindowActivated(java.awt.event.WindowEvent evt) {
// TODO add your handling code here:
//jButton6.setLabel(“testing”);
// Retrieve the three icons

DefaultMutableTreeNode root = new DefaultMutableTreeNode(“Monitoring Jaringan IP Alarm”);
createNode(root);
DefaultTreeModel tree = new DefaultTreeModel(root);
jTree1.setModel(tree);
setChangeTree(jTree1);

}

Wah tapi cara di atas digunakan untuk merubah secara sederhana aja, gimana klo kita mengubah berdasarkan data base misal ketika kondisi A maka menggunakan ICON A trus ketika kondisi B menggunakan ICON B, hehe. Gak usah bingung ternyata ada cara lain yang disediakan oleh java yaitu render ulang aja. Intinya Data yang kita masukking ke Jtree taruh dalam suatu OBjek nanti digunakan sewaktu kita panggil. Ini adalah hasilnya

Bikin kelas kusus untuk merender tampilan JTree kita misal:
import java.awt.Component;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;

/**
*
* @author mamat-dev
*/
public class MyRenderer extends DefaultTreeCellRenderer {
Icon leafOn;
Icon leafOff;
Icon nodeOn;
Icon nodeOff;
public String text,ip;

public MyRenderer(Icon _leafOn,Icon _leafOff, Icon _nodeOn, Icon _nodeOff) {
leafOn = _leafOn;
leafOff = _leafOff;
nodeOn = _nodeOn;
nodeOff = _nodeOff;
}

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);

int i=0;

if(expanded){
if(i==1){
setIcon(nodeOn);
i=0;
} else {
setIcon(nodeOff);
}
} else if(leaf && isLeafOn(value)){
setIcon(leafOff);
setText(text+” (Alarm Aktif)”);
i=1;
} else if(leaf) {
setIcon(leafOn);
} else {
if(i==1){
setIcon(nodeOn);
i=0;
} else {
setIcon(nodeOff);
}
}
return this;
}

//ini adalah waktu even Leaf
protected boolean isLeafOn(Object value) {

//ambil objectnya dari tree node
DefaultMutableTreeNode node =(DefaultMutableTreeNode)value;
ObjectTree nodeInfo = (ObjectTree)(node.getUserObject());
String title = nodeInfo.nodeStatus;
if (title.equals(“0”)) {
text = nodeInfo.nodeName;
return true;
}

return false;
}

}

Nah setelah bikin kelas setting aja tampilan icon yang diingankan, misal icon kondisi ON or icon kondisi OFF baik untuk root nya maupun cabangnya.
public void setChangeTree(JTree tree){
ImageIcon clientIcon = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/ipalarm-24.png”));
ImageIcon clientIconOff = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/Alert-24.png”));
ImageIcon nodeIcon = new ImageIcon(getClass().getResource(“/ipalarmdesktop/images/monitor-24.png”));

// Update only one tree instance
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer();

if (clientIcon != null) {
tree.setCellRenderer(new MyRenderer(clientIcon,clientIconOff,nodeIcon,nodeIcon));
} else {
System.err.println(“Tutorial icon missing; using default.”);
}

// Create tree with new icons
tree = new JTree();
}

OK, sekarang tinggal tampilin deh..!
DefaultMutableTreeNode root = new DefaultMutableTreeNode(“Monitoring Jaringan IP Alarm”);
createNode(root);
DefaultTreeModel tree = new DefaultTreeModel(root);
jTree1.setModel(tree);
setChangeTree(jTree1);

Eit MAATT..!, kok ada “createNode(root)”..? Yuup itu seperti contoh di atasnya struktur treenya, klo tampilan diatas sudah ane hubungkan dengan webservice yang memonitoring langsung keadaan sensor. Nah nih gua bagi tips bikin Event Timer yang fungsinya digunakan untuk memanggil METHOD secara terus menerus dan boleh dicatat karena kita menggunakan “import javax.swing.Timer” maka timer ini udah mengandung Thread jadi gak ganggu proses yang lain, Mantap kan🙂.
Action testing = new AbstractAction() {
boolean shouldDraw = false;
public void actionPerformed(ActionEvent e) {
if (shouldDraw = !shouldDraw) {
jLStatus.setText(“Status: mengambil data sensor”);
DefaultMutableTreeNode root = new DefaultMutableTreeNode(“Monitoring Jaringan IP Alarm”);
createNode(root);
DefaultTreeModel tree = new DefaultTreeModel(root);
jTree1.setModel(tree);
setChangeTree(jTree1);
for(int i=0;i<jtree1.getrowcount();i++){
</jtree1.getrowcount();i++){
jTree1.expandRow(i+1);
}

} else {
jLStatus.setText(“Status: Ok”);
}
}
};

new Timer(3000, testing).start();

 Thank’s to Mamat Zone

2 Tanggapan

  1. Dear All,

    Mau tanya donk, ada yang udah pernah buat swing pakai OpenSwing? kok aku susah banget sih panggil InternalFrame di parent root?
    Ex :
    DefaultMutableTreeNode root = new OpenSwingTreeNode();
    DefaultTreeModel model = new DefaultTreeModel(root);
    ApplicationFunction n1 = new ApplicationFunction(“Parent”,null);

    ApplicationFunction n11 = new ApplicationFunction(“Master”,null);
    ApplicationFunction n111 = new ApplicationFunction(“Employee”,”Child”,null,”getEmployee”);

    Niatnya sih, mau kayak child root “Employee” gitu, bisa panggil getEmployee.

    Thx all,

  2. Thank You

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: