Montag, 19. Januar 2009
Fett und Durchgestrichen
mattki, 22:38h
Wie ändere ich die Schriftart einer JComponent dahingehend, dass sie fett und durchgestrichen wird?
Zum Beispiel mit dieser kleinen Methode:
private static void changeFontOfComponent(JComponent comp, boolean bold, boolean strikethrough) {
Map attributes = new Hashtable(2);
attributes.put(TextAttribute.WEIGHT, bold ? TextAttribute.WEIGHT_BOLD : TextAttribute.WEIGHT_REGULAR);
attributes.put(TextAttribute.STRIKETHROUGH, Boolean.valueOf(strikethrough));
comp.setFont(comp.getFont().deriveFont(attributes));
}
Zum Beispiel mit dieser kleinen Methode:
private static void changeFontOfComponent(JComponent comp, boolean bold, boolean strikethrough) {
Map attributes = new Hashtable(2);
attributes.put(TextAttribute.WEIGHT, bold ? TextAttribute.WEIGHT_BOLD : TextAttribute.WEIGHT_REGULAR);
attributes.put(TextAttribute.STRIKETHROUGH, Boolean.valueOf(strikethrough));
comp.setFont(comp.getFont().deriveFont(attributes));
}
... link (0 Kommentare) ... comment
Montag, 12. Januar 2009
Zeilen einer CSV-Datei splitten
mattki, 19:11h
Wie kann man eine Zeile einer CSV-Datei splitten? Ganz einfach, mit der String-Methode 'split'.
Nun das Problem: Die String-Werte sind in Anführungszeichen eingeschlossen und können auch das Trennzeichen als normalen Text enthalten. Die 'split'-Methode kann die vermeintlichen Trennzeichen in dem normalen Text nicht übersehen. Eine Lösung bietet meine CsvSplitter Klasse:
public class CsvSplitter
{
// public static void main(String[] args) {
// CsvSplitter sp = new CsvSplitter(';', '"');
// System.out.println(Arrays.toString(sp.split("a;b;cde;\"ha;ha; you never expected this\";test")));
// System.out.println(Arrays.toString(sp.split("a;b;cde;")));
// System.out.println(Arrays.toString(sp.split("ade")));
// System.out.println(Arrays.toString(sp.split("")));
// System.out.println(Arrays.toString(sp.split("\"as\"f\";")));
// }
public CsvSplitter(char delimiter, char quote) {
this.delimiter = delimiter;
this.quote = quote;
}
public String[] split(String s) {
if (s.length() == 0) {
return new String[] { "" };
}
text = s;
init();
int tokenCount = 0;
while (nextToken()) {
tokenCount++;
}
String result[] = new String[tokenCount];
init();
int i = 0;
while (nextToken()) {
result[i++] = s.substring(startIdx, endIdx);
}
return result;
}
private char delimiter;
private char quote;
private String text;
private int length;
private boolean quoteOpened;
private int startIdx;
private int endIdx;
private int textIdx;
private void init() {
length = text.length();
quoteOpened = false;
startIdx = 0;
endIdx = 0;
textIdx = 0;
}
/**
* calculates startIdx and endIdx of next token
*/
private boolean nextToken() {
if (textIdx > 0) {
if (textIdx == length && endIdx < length && text.charAt(endIdx) == delimiter) { // empty token
endIdx = startIdx;
return true;
}
else if (textIdx >= length) {
return false; // no more token
}
startIdx = endIdx + 1; // index of next token
}
boolean tokenFound = false;
while (!tokenFound) {
char ch = text.charAt(textIdx);
if (ch == quote) {
if (quoteOpened) {
if (textIdx + 2 < length) {
quoteOpened = text.charAt(textIdx + 1) != delimiter;
}
else {
quoteOpened = false;
}
}
else {
quoteOpened = true;
}
}
else if (!quoteOpened && ch == delimiter) {
endIdx = textIdx;
tokenFound = true;
}
else if (textIdx == length - 1) {
endIdx = textIdx + 1;
tokenFound = true;
}
textIdx++;
}
return true;
}
}
Nun das Problem: Die String-Werte sind in Anführungszeichen eingeschlossen und können auch das Trennzeichen als normalen Text enthalten. Die 'split'-Methode kann die vermeintlichen Trennzeichen in dem normalen Text nicht übersehen. Eine Lösung bietet meine CsvSplitter Klasse:
public class CsvSplitter
{
// public static void main(String[] args) {
// CsvSplitter sp = new CsvSplitter(';', '"');
// System.out.println(Arrays.toString(sp.split("a;b;cde;\"ha;ha; you never expected this\";test")));
// System.out.println(Arrays.toString(sp.split("a;b;cde;")));
// System.out.println(Arrays.toString(sp.split("ade")));
// System.out.println(Arrays.toString(sp.split("")));
// System.out.println(Arrays.toString(sp.split("\"as\"f\";")));
// }
public CsvSplitter(char delimiter, char quote) {
this.delimiter = delimiter;
this.quote = quote;
}
public String[] split(String s) {
if (s.length() == 0) {
return new String[] { "" };
}
text = s;
init();
int tokenCount = 0;
while (nextToken()) {
tokenCount++;
}
String result[] = new String[tokenCount];
init();
int i = 0;
while (nextToken()) {
result[i++] = s.substring(startIdx, endIdx);
}
return result;
}
private char delimiter;
private char quote;
private String text;
private int length;
private boolean quoteOpened;
private int startIdx;
private int endIdx;
private int textIdx;
private void init() {
length = text.length();
quoteOpened = false;
startIdx = 0;
endIdx = 0;
textIdx = 0;
}
/**
* calculates startIdx and endIdx of next token
*/
private boolean nextToken() {
if (textIdx > 0) {
if (textIdx == length && endIdx < length && text.charAt(endIdx) == delimiter) { // empty token
endIdx = startIdx;
return true;
}
else if (textIdx >= length) {
return false; // no more token
}
startIdx = endIdx + 1; // index of next token
}
boolean tokenFound = false;
while (!tokenFound) {
char ch = text.charAt(textIdx);
if (ch == quote) {
if (quoteOpened) {
if (textIdx + 2 < length) {
quoteOpened = text.charAt(textIdx + 1) != delimiter;
}
else {
quoteOpened = false;
}
}
else {
quoteOpened = true;
}
}
else if (!quoteOpened && ch == delimiter) {
endIdx = textIdx;
tokenFound = true;
}
else if (textIdx == length - 1) {
endIdx = textIdx + 1;
tokenFound = true;
}
textIdx++;
}
return true;
}
}
... link (0 Kommentare) ... comment
Freitag, 12. September 2008
Aus Icon wird Image
mattki, 20:02h
Diese Methode macht aus einem javax.swing.Icon ein java.awt.Image Objekt:
public Image iconToImage(Icon icon) {
if (icon instanceof ImageIcon) {
return ((ImageIcon)icon).getImage();
}
else {
int w = icon.getIconWidth();
int h = icon.getIconHeight();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(w, h);
Graphics2D g = image.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
return image;
}
}
public Image iconToImage(Icon icon) {
if (icon instanceof ImageIcon) {
return ((ImageIcon)icon).getImage();
}
else {
int w = icon.getIconWidth();
int h = icon.getIconHeight();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(w, h);
Graphics2D g = image.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
return image;
}
}
... link (0 Kommentare) ... comment
Donnerstag, 21. August 2008
JComponent in ein Image zeichnen
mattki, 19:19h
Wie zeichnet man eine JComponent in ein Image?
private static Image createImage(JComponent c) {
BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
c.paint(g2);
return image;
}
private static Image createImage(JComponent c) {
BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
c.paint(g2);
return image;
}
... link (0 Kommentare) ... comment
Montag, 7. Juli 2008
Bean Properties kopieren
mattki, 20:23h
Wie kopiert man Bean Properties?
org.apache.commons.beanutils.BeanUtils.copyProperties(Object target, Object source);
org.apache.commons.beanutils.BeanUtils.copyProperties(Object target, Object source);
... link (0 Kommentare) ... comment
Donnerstag, 3. Juli 2008
Serial Version UID
mattki, 16:21h
Serialisierbare Java-Objekte (die java.io. Serializable implementieren) sollten sinnvollerweise ein Feld serialVersionUID haben. Generieren kann man die UID in der Kommandozeile:
serialver package.ClassName
serialver ist ein Programm aus dem Java-Bin-Ordner.
Das Kommando muss im Bin-Ordner des aktuellen Projekts ausgeführt werden, damit die Klasse gefunden wird.
serialver package.ClassName
serialver ist ein Programm aus dem Java-Bin-Ordner.
Das Kommando muss im Bin-Ordner des aktuellen Projekts ausgeführt werden, damit die Klasse gefunden wird.
... link (0 Kommentare) ... comment
Montag, 9. Juni 2008
Logs doppelt?
mattki, 20:38h
Wie verhindert man, dass Log4j Einträge doppelt schreibt?
Wenn eine log4j.xml im Spiel ist, dann mit einem Attribut "additivity". Ansonsten halt über eine Property:
log4j.xml: <category name="xy" additivity="false">
log4j.properties: log4j.additivity.xy=false
Wenn eine log4j.xml im Spiel ist, dann mit einem Attribut "additivity". Ansonsten halt über eine Property:
log4j.xml: <category name="xy" additivity="false">
log4j.properties: log4j.additivity.xy=false
... link (0 Kommentare) ... comment
Freitag, 23. Mai 2008
Sichere Umlaute
mattki, 19:41h
Wenn Umlaute eingefügt werden kann ggf. das Compilieren fehlschlagen oder unter Umständen werden die Zeichen später als "Hieroglyphen" angezeigt. Wie kann man "sicher" Umlaute in Java-Quellcode einfügen?
Schreibt man die Umlaute als Unicode-Sequenz, kann nix passieren:
Ä : \u00c4
Ö : \u00d6
Ü : \u00dc
ä : \u00e4
ö : \u00f6
ü : \u00fc
Mit dem Programm native2ascii aus dem Java-bin-Verzeichnis kann man alle Sonderzeichen in einer Textdatei automatisch Unicode kodieren lassen:
%JAVA_HOME%/bin/native2ascii datei1 > datei2
Schreibt man die Umlaute als Unicode-Sequenz, kann nix passieren:
Ä : \u00c4
Ö : \u00d6
Ü : \u00dc
ä : \u00e4
ö : \u00f6
ü : \u00fc
Mit dem Programm native2ascii aus dem Java-bin-Verzeichnis kann man alle Sonderzeichen in einer Textdatei automatisch Unicode kodieren lassen:
%JAVA_HOME%/bin/native2ascii datei1 > datei2
... link (0 Kommentare) ... comment