Zeichnung zu groß, JScrollPane hat keine Scrollbalken

Charriu

Mitglied
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.

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
 
Hi,
Es geht nachwievor nicht weiter. Für den testfall habe ich jetzt eine jScrollPane drum bekommen, keine Ahnung warum das vorher immer nicht gang. Damit kann ich es in der Test-main() nett aufrufen und drin rum scrollen.

Aber wenn ich es jetztb wirklich benutzen will, dann zeigt mein Ergebnis-Fenster genau nichts. Nehme ich aber das Objekt und schmeiß es von da wieder in ein neuen JFrame ist es plötzlich sichtbar. Und verändert man dessen Größe verschwindet plötzlich ein Teil des Bildes, aber nicht etwas Bereiche aus denen mal rausgescrollt ist sondern willkürlich einfach irgendwas.

Also ich hab ja eigentlich angenommen in Klasse A ein Fenster aufzumachen mit normaler GUI und darunter etwas Zeichnen lassen mit Klasse B sei etwas was ungefähr 1 Millionen mal am Tag gemacht wird. Entweder hab ich so gar keine Befähigung für den Kram oder Java und Grafik passt einfach nicht zusammen. Das kann doch nicht so schwer sein, oder?

Charriu
 
Hallo,
Weiß den wirklich niemand wie man irgendwas mit Java zeichnet? Hock da jetzt schon wieder den ganzen Tag dran und es geht kein Stück weiter. Es kommt ja auch nicht mal ne Fehlermeldung. Kann es daran liegen dass ich erst in einem Thread die Daten erhebe und bearbeite und erst danach das Diagramm zeichnen will?

Charriu
 

Neue Beiträge

Zurück