петък, 15 август 2008 г.

Tomcat Virtual Directory

You can create an individual context.xml file, to define a context.
You then specify the base directory for that webapp, whereever it is.

In Tomcat4, this file goes in the appBase directory (default = $CATALINA_HOME/webapps
In Tomcat5, this file goes in the $CATALINA_HOME/conf/[enginename]/[hostname]/ directory


(Context path="/my_site" docBase="C:/my_site")

(/Context)

Other usefull article: http://gandhim.wordpress.com/2008/01/31/tomcat-55-virtual-directory/

Calculate PI with arbitrary precision in Java / Изчисляване на числото Пи с произволна точност използвайки Java

Coming Soon
http://blog.taragana.com/index.php/archive/calculate-pi-to-arbitrary-precision-sample-java-code/

сряда, 13 август 2008 г.

Java and SSH

Coming Soon (maybe next week)

http://www.openssh.com/java.html
http://www.trilead.com/Products/Trilead_SSH_for_Java/
http://sshwindows.sourceforge.net/

Google's Keyczar / Keyczar - шифриране за начинаещи

Coming Soon

http://googleonlinesecurity.blogspot.com/2008/08/keyczar-safe-and-simple-cryptography.html
http://code.google.com/p/keyczar/wiki/NonGoals

вторник, 12 август 2008 г.

JTable tips - 1



Преди време ми се наложи да си поиграя с невероятната компонента JTable :) Имаше едно приложение което показваше някаква информация в голяма таблица. То беше написано на Java и потребителския му интерфейс използваше Swing (за добро или лошо). Проблемът беше, че ако текстът в някоя клетка беше твърде дълъг, просто не се събираше и не се виждаше частта която не се събира в очертанията на клетката. Тогава ми хрумна една идея, не е кой знае колко гениална, но беше решение на проблема. Накарах таблицата да показва всички записи в шрифт с еднакви по дължина символи (например Courier New) и установявах дължината на дадената колона да бъде приблизително равна на дължината на стринга на най "дългата" клетка. Получи се "нещо":)
Един друг вариант е просто да се покаже tooltip с текста на конкретната клетка, без да се променя размера на колоната в която се намира.

import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class MultiLineToolTipInsideJTableCell extends JFrame {
public static void main(String[] args) {

new MultiLineToolTipInsideJTableCell();
}

public MultiLineToolTipInsideJTableCell() {
//initilize
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
//JTable
JTable table = new JTable() {

//Implement table cell tool tips.
public String getToolTipText(MouseEvent e) {
String tip = null;
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int realColumnIndex = convertColumnIndexToModel(colIndex);

try {
if (realColumnIndex == 1 && rowIndex != 0) { //comment row, exclude heading
tip = getValueAt(rowIndex, colIndex).toString();
}
if (realColumnIndex == 2 && rowIndex != 0) { //comment row, exclude heading
tip = getValueAt(rowIndex, colIndex).toString();
}
} catch (RuntimeException e1) {
//catch null pointer exception if mouse is over an empty line
}
return tip;
}
};
//
table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
"", "", "" }) {
});

((DefaultTableModel) table.getModel()).setRowCount(4);

table.getModel().setValueAt("USERNAME", 0, 0);
table.getModel().setValueAt("DATE", 0, 1);
table.getModel().setValueAt("COMMENTS", 0, 2);

//generate table's content here
for (int i = 1; i <= 3; i++) {
table.getModel().setValueAt("User" + i, i, 0);
table.getModel().setValueAt("Date" + i, i, 1);
table.getModel().setValueAt(
"A very loooooooooooooooooooooooooooooooooooooong comment. "
+ i, i, 2);
}

//finalize
panel.add(table);
this.add(panel);
this.setSize(250, 150);
this.setVisible(true);
}
}