Program się nie kończy

0

Napisałem program, który wyświetla wykres w oknie. Używam pakietu JFreeChart. Problem mam taki, że po kliknięciu na krzyżyk okno znika ale program nadal jest uruchomiony. Musze kliknąć Terminate w Eclipsie i wtedy dopiero program okńczy działanie.

Tutaj kod wykresu i okna:

package pic.img;

import java.awt.Color;
import java.util.Random;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.statistics.HistogramDataset;
import org.jfree.data.xy.IntervalXYDataset;

public class HistogramChart extends JPanel {

	public HistogramChart(double[] values) {
		super();
		JFreeChart chart = createChart(createDataset(values));
		add(new ChartPanel(chart));
	}

	private JFreeChart createChart(IntervalXYDataset dataset) {
		// TODO Auto-generated method stub
		JFreeChart chart = ChartFactory.createHistogram("Histogram Demo 1",
				null, null, dataset, PlotOrientation.VERTICAL, true, true,
				false);
		XYPlot plot = (XYPlot) chart.getPlot();
		XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer();
		renderer.setSeriesPaint(0, Color.BLUE); 
		renderer.setDrawBarOutline(true); 
		return chart;
	}

	private IntervalXYDataset createDataset(double[] values) {
		// TODO Auto-generated method stub
		HistogramDataset dataset = new HistogramDataset(); 
		Random generator = new Random(); 
		for (int i = 0; i < 1000; i++) { 
			values[i] = generator.nextInt(256); 
		}

		dataset.addSeries("H1", values, 32, 0, 255);
		for (int i = 0; i < 32; i++) {
			System.out.println(dataset.getYValue(0, i));
		}

		return dataset;
	}

}
package pic.frame;
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import pic.img.HistogramChart;

public class Ramka extends javax.swing.JDialog {
	private JPanel testPanel;
	HistogramChart h;

	/**
	* Auto-generated main method to display this JDialog
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame();
				Ramka inst = new Ramka(frame);
				inst.setVisible(true);
			}
		});
	}
	
	public Ramka(JFrame frame) {
		super(frame);
		initGUI();
	}
	
	private void initGUI() {
		try {
			double[] tablicaKolorow = new double[1000];
			h = new HistogramChart(tablicaKolorow);
			testPanel = new JPanel();
			getContentPane().add(testPanel, BorderLayout.CENTER);
			testPanel.setPreferredSize(new java.awt.Dimension(392, 272));
			testPanel.add(h);
			setSize(400, 300);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Wie ktos jak sobie z tym poradzić? Żeby program kończył działanie normalnie po kliknięciu na krzyżyk?

0

poszukaj w JFrame metody setDefaultCloseOperation i ustaw ja bodajze na EXIT_ON_CLOSE czy cos takiego.

0

Nie działa jak wywołuje na Ramce, a na Histogramie nie moge w ogóle wywołać bo to JPanel a nie JFrame.

0

Może tak modyfikacja konstruktora klasy Ramka pomoże

public Ramka(JFrame frame) {
                super(); //<- zmiana, frame nie jest już potrzebny! 
                initGUI();
                setDefaultCloseOperation(DISPOSE_ON_CLOSE); // <- dodalem
        }
0

A jest jakiś ważny powód, żeby Ramka była klasy JDialog, a nie JFrame ?

0

Dzieki rkrix, pomogło. Zamyka się z drobnym opóźnieniem ale to już nie jest taki problem.
bogdans, powodu nie ma, zmieniłem na JFrame.

Dzieki za szybką pomoc :)

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