Zdjęcie ograniczenia z rozmiaru ramki/problem z rysowaniem.

0

Witam.
Mam taki problem, że tworzę sobie ramkę, potem panel(JPanel) i po nim rysuję. Wszystko to zapisuję do pliku png.

Założenie programu jest takie żeby móc wygenerować dowolnie duży obrazek np. 10 000px x 10 000px. Taki obrazek się generuje ale na obrazku jest "narysowana" zawartość taka jaką ma ramka a reszta jest biała. Pomimo że ustawiam wielkość ramki i panelu dużo większą niż rozdzielczość ekranu to rozmiar utworzonej ramki ma ograniczenie takie jak rozdzielczość ekranu.

Więc szukam sposobu żeby zdjąć to ograniczenie albo może ktoś zna lepszy sposób na wykonanie tego rysunku. Poniżej wklejam kod.

import java.awt.*;
import java.io.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Dywan {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		RamkaRysunku ramka = new RamkaRysunku();
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ramka.setVisible(true);
	}

}

class RamkaRysunku extends JFrame
{
	public RamkaRysunku()
	{
		rozmiar=JOptionPane.showInputDialog("Wpisz rozmiar obrazka (RxR)\nR=?");
		//System.out.println(rozmiar);
		setSize(Integer.parseInt(rozmiar),Integer.parseInt(rozmiar));
		PanelRysunku panel = new PanelRysunku(rozmiar);
		Container zawartosc = getContentPane();
		panel.setBackground(Color.black);
		zawartosc.add(panel);
		JOptionPane.showMessageDialog(zawartosc, "Trwa rysowanie.\nPo zamknięciu okna należy poczekać pewien czas na pojawienie się pliku(czas proporcjonalny do wielkości obrazka).");
		panel.Zapisz();
	}
	
	public static String rozmiar;
}

class PanelRysunku extends JPanel
{
	public PanelRysunku(String rozmiar)
	{
		this.rozmiar=Integer.parseInt(rozmiar);
		//Dimension rozm = new Dimension(rozmiar,rozmiar);
		//this.setMaximumSize(new Dimension(this.rozmiar,this.rozmiar));
		//this.setMinimumSize(new Dimension(this.rozmiar,this.rozmiar));
		//this.setSize(this.rozmiar, this.rozmiar);
		//System.out.println("W konstruktorze rozmiar = "+this.rozmiar);
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;
		//Rysowanie
		
		g2.setPaint(Color.white);
		Point2D punkt;
		for(int x=0;x<400000;x++)
		{
			punkt  = new Point2D.Double(wygeneruj(),wygeneruj());
			g2.draw(new Line2D.Double(punkt,punkt));
		}
	}
	
	public void Zapisz()
	{
		BufferedImage bi = new BufferedImage(rozmiar,rozmiar,BufferedImage.TYPE_INT_ARGB);
		Graphics2D obr = bi.createGraphics();
		this.paint(obr);
		obr.dispose();
		File plik = new File("obraz.png");
		try
		{
			ImageIO.write(bi, "png", plik);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
		}
	}
	private void losuj()
	{
		double wylosowana;
		for(int i=0;i<10;i++)
		{
			wylosowana = Math.random();
			wylosowane[i]=(long)Math.round(wylosowana);
			if(wylosowane[i]==1) wylosowane[i]++;
		}
	}
	
	private long wygeneruj()
	{
		long wynik;
		double wynik2,wynik3 =0;
		do
		{
			wynik=0;
			losuj();
			for(int i=0;i<10;i++)
			{
				wynik2=wylosowane[i]/Math.pow(3, (i+1));
				wynik3+=wynik2;
			}
			wynik=(long)(wynik3*rozmiar);
		}while(wynik<1&&wynik>(rozmiar-1));
		return wynik;
	}
	
	private long[] wylosowane = new long[10];
	private int rozmiar;
}
0

Obraz cały czas trzymaj w pamięci i rysuj go w odpowiednim zdarzeniu. Pewne tipy: http://stackoverflow.com/questions/5289194/redrawing-graphics-in-java
Wtedy przy odświeżaniu widoku kontrolki obraz będzie odrysowywany na nowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1