Hallo Forum,
Ich muss mich wieder einmal an euch wenden. Ich bin total verzweifelt, ich schreib gerade an meiner Abschlussarbeit und muss ein Programm erstellen. Bis jetzt lief es eigentlich ganz gut, aber jetzt ist meinem Betreuer eingefallen, dass eine grafische Darstellung ja ganz nett wäre. Ich hab leider in Java noch nie was gezeichnet, außer halt mal so rumgespielt und nen Oval gemalt.
Ich scheitere hier jetzt an meheren Sachen. Ich soll also aus den Objekten einer Liste ein Diagramm malen, das können sehr viele Elemente im Diagramm sein. Alle hintereinander weg, also sehr lang.
Das zeichnen habe ich jetzt hinbekommen. Hab da mal meine Klasse "TimingDiagramm" um JComponent erweitert und in "paintComponent()" das ganze gezeichnet. Nun ist das aber sehr viel größer als mein Fenster.
1. Ich hab versucht es in eine ScrollPane zu tun, aber der zeigt keine ScrollBars an. Jetzt hab ich gegoogelt wie man das machen kann. Und zig Möglichkeiten versucht (implements Scrollable und zunächst als Buffered Image speichern etc.) aber nichts hat funktioniert. Wie kriegt man das den hin? Im Beispiel-Code ist das jetzt nur die Grafik, später wird sie in einem GridBagLayout sitzen.
2. Beim speichern als Bild habe ich festgestellt, er speichert auch immer nur das was im Fenster sichtbar ist. Nicht mal da speichert er alles, aber wenn man das Fenster größer macht ist doch alles da?
Ich bin gerade echt fertig, weil ich da seid Freitag dran rumbastel und keine Lösung finde. Und es ist ja nicht so, dass das die letzte Baustelle wäre. Vielleicht geht das ja eigentlich alles ganz einfach und ich habs nur nicht gefunden. Ich wäre auf jeden Fall für jede Hilfe dankbar.
So, hier mal der Code. Nicht wegen den Tabellen und so gucken, das hab ich mir da nur hingebaut, weil ich nicht jedes mal den Rest meines Programmes durchlaufen lassen wollte. Ihr braucht aber JFreeChart damit es läuft.
Liebe Grüße,
Felix
Ich muss mich wieder einmal an euch wenden. Ich bin total verzweifelt, ich schreib gerade an meiner Abschlussarbeit und muss ein Programm erstellen. Bis jetzt lief es eigentlich ganz gut, aber jetzt ist meinem Betreuer eingefallen, dass eine grafische Darstellung ja ganz nett wäre. Ich hab leider in Java noch nie was gezeichnet, außer halt mal so rumgespielt und nen Oval gemalt.
Ich scheitere hier jetzt an meheren Sachen. Ich soll also aus den Objekten einer Liste ein Diagramm malen, das können sehr viele Elemente im Diagramm sein. Alle hintereinander weg, also sehr lang.
Das zeichnen habe ich jetzt hinbekommen. Hab da mal meine Klasse "TimingDiagramm" um JComponent erweitert und in "paintComponent()" das ganze gezeichnet. Nun ist das aber sehr viel größer als mein Fenster.
1. Ich hab versucht es in eine ScrollPane zu tun, aber der zeigt keine ScrollBars an. Jetzt hab ich gegoogelt wie man das machen kann. Und zig Möglichkeiten versucht (implements Scrollable und zunächst als Buffered Image speichern etc.) aber nichts hat funktioniert. Wie kriegt man das den hin? Im Beispiel-Code ist das jetzt nur die Grafik, später wird sie in einem GridBagLayout sitzen.
2. Beim speichern als Bild habe ich festgestellt, er speichert auch immer nur das was im Fenster sichtbar ist. Nicht mal da speichert er alles, aber wenn man das Fenster größer macht ist doch alles da?
Ich bin gerade echt fertig, weil ich da seid Freitag dran rumbastel und keine Lösung finde. Und es ist ja nicht so, dass das die letzte Baustelle wäre. Vielleicht geht das ja eigentlich alles ganz einfach und ich habs nur nicht gefunden. Ich wäre auf jeden Fall für jede Hilfe dankbar.
So, hier mal der Code. Nicht wegen den Tabellen und so gucken, das hab ich mir da nur hingebaut, weil ich nicht jedes mal den Rest meines Programmes durchlaufen lassen wollte. Ihr braucht aber JFreeChart damit es läuft.
Code:
/**
*
*/
package uml;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.ScrollPane;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.TreeMap;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;
import org.jfree.data.time.Minute;
import org.jfree.data.time.RegularTimePeriod;
import data.BestActionObject;
/**
* @author felixgelpke
*
*/
public class TimingDiagramm extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
*
*/
private LinkedList<ActionTime> perfectList = new LinkedList<ActionTime>();
/**
*
*/
private LinkedList<ActionTime> perfectList2 = new LinkedList<ActionTime>();
/**
*
*/
public TimingDiagramm() {
// public TimingDiagramm(TreeMap<RegularTimePeriod, BestActionObject>
// mapBase,
// TreeMap<RegularTimePeriod, BestActionObject> mapOptimized) {
TreeMap<RegularTimePeriod, BestActionObject> mapBase = new TreeMap<RegularTimePeriod, BestActionObject>();
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 0)),
new BestActionObject("none", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 5)),
new BestActionObject("none", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 10)),
new BestActionObject("none", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 15)),
new BestActionObject("none", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 20)),
new BestActionObject("deinstall", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 25)),
new BestActionObject("deinstall", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 30)),
new BestActionObject("increaseMemory", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 35)),
new BestActionObject("increaseMemory", 0.5d));
mapBase.put(new Minute(new Date(2009, 10, 9, 10, 40)),
new BestActionObject("decreaseMemory", 0.5d));
TreeMap<RegularTimePeriod, BestActionObject> mapOptimized = new TreeMap<RegularTimePeriod, BestActionObject>();
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 0)),
new BestActionObject("deinstall", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 5)),
new BestActionObject("deinstall", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 10)),
new BestActionObject("increaseMemory", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 15)),
new BestActionObject("none", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 20)),
new BestActionObject("lazy caching", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 25)),
new BestActionObject("none", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 30)),
new BestActionObject("none", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 35)),
new BestActionObject("increaseMemory", 0.5d));
mapOptimized.put(new Minute(new Date(2009, 10, 9, 10, 40)),
new BestActionObject("decreaseMemory", 0.5d));
for (RegularTimePeriod time : mapBase.keySet()) {
perfectList.add(new ActionTime(mapBase.get(time).getAction(), time));
}
for (RegularTimePeriod time : mapOptimized.keySet()) {
perfectList2.add(new ActionTime(mapOptimized.get(time).getAction(), time));
}
}
/**
*
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
int width = 110;
int height = 18;
int margin_top = 15;
int margin_left = 70;
int[] xA = {margin_left, 80, 170, 180, 170, 80, margin_left};
int[] yA = {margin_top + (height / 2), margin_top, margin_top, margin_top + (height / 2), margin_top + height, margin_top + height, margin_top + (height / 2)};
int pictWidth = margin_left + (width * perfectList.size());
System.out.println(pictWidth);
BufferedImage image = new BufferedImage(pictWidth, 400, BufferedImage.TYPE_INT_ARGB);
image = (BufferedImage) this.createImage(this.getWidth(), this.getHeight());
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Font font = new Font("sansserif", Font.PLAIN, 14);
g2.setFont(font);
g2.drawString("Base", 5, 30);
g2.drawString("Optimized", 5, 75);
font = new Font("sansserif", Font.BOLD, 10);
g2.setFont(font);
for (int i = 0; i < perfectList.size(); i++) {
g2.setColor(Color.LIGHT_GRAY);
g2.fillPolygon(xA, yA, 7);
centerText(perfectList.get(i).getAction(), null, g, xA[0],
margin_top, width, height);
for (int j = 0; j < xA.length; j++) {
xA[j] = xA[j] + width;
}
}
margin_top = 60;
int[] xA2 = {margin_left, 80, 170, 180, 170, 80, margin_left};
int [] yA2 = {margin_top + (height / 2), margin_top, margin_top, margin_top + (height / 2), margin_top + height, margin_top + height, margin_top + (height / 2)};
for (int i = 0; i < perfectList2.size(); i++) {
g2.setColor(Color.CYAN);
g2.fillPolygon(xA2, yA2, 7);
centerText(perfectList2.get(i).getAction(), null, g, xA2[0],
margin_top, width, height);
for (int j = 0; j < xA2.length; j++) {
xA2[j] = xA2[j] + width;
}
}
int xPos = margin_left;
g2.setColor(new Color(1, 0 ,0 , 0.25f));
for (int i = 0; i < perfectList.size(); i++) {
if (!perfectList.get(i).getAction().equals(perfectList2.get(i).getAction())) {
g2.fillRect(xPos + 10, 15, 90, 63);
}
xPos += width;
}
Graphics2D graphic = (Graphics2D) g;
graphic.drawImage(image, null, 0, 0);
try {
ImageIO.write(image, "png", new File("test.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* http://www.davidflanagan.com/
*
* @param s1
* @param s2
* @param g
* @param c
* @param x
* @param y
* @param w
* @param h
*/
protected void centerText(String s1, String s2, Graphics g, int x,
int y, int w, int h) {
Font f = g.getFont();
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(f);
int ascent = fm.getAscent();
int height = fm.getHeight();
int width1 = 0, width2 = 0, x0 = 0, x1 = 0, y0 = 0, y1 = 0;
width1 = fm.stringWidth(s1);
if (s2 != null)
width2 = fm.stringWidth(s2);
x0 = x + (w - width1) / 2;
x1 = x + (w - width2) / 2;
if (s2 == null)
y0 = y + (h - height) / 2 + ascent;
else {
y0 = y + (h - (int) (height * 2.2)) / 2 + ascent;
y1 = y0 + (int) (height * 1.2);
}
g.setColor(Color.BLACK);
g.drawString(s1, x0, y0);
if (s2 != null)
g.drawString(s2, x1, y1);
}
/**
* This method parse a JFreeChart RegularTimePeriod to a normal date.
*
* @param timestamp
* @return
*/
private Date parseMinute(RegularTimePeriod timestamp) {
String tmp = timestamp.toString();
tmp = tmp.substring(11, 18);
DateFormat out = new SimpleDateFormat("HH:mm:ss");
Date date = null;
try {
date = out.parse(tmp);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* For testing.
* @param args
*/
public static void main(String[] args) {
TimingDiagramm td = new TimingDiagramm();
System.out.println(td.getSize().width);
JScrollPane scroll = new JScrollPane(td);
scroll.setHorizontalScrollBar(new JScrollBar());
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
JFrame f = new JFrame();
f.add(scroll);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400, 300);
}
}
Liebe Grüße,
Felix