S
Sakulrelda
Gast
Hallo Ihr,
ich habe eine Klasse, die zur Erstellung eines Diagramms dient.
Dieses Diagramm soll später in einem Label auf meinem MainFrame erscheinen.
Ich frage mich, wie ich das Diagramm implementiert bekomme...
-> Also wie ihr vielleicht gesehen habt, will ich das erzeugte Diagramm der Diagramm-Klasse im FETT-hinterlegten Label der MainFrame Klasse anzeigen lassen.
-> Ist das möglich? (Wenn Ja, wie?)
-> Wenn nicht möglich, was muss ich machen, damit ich es trotzdem in meinem Tab anzeigen lassen kann...
ich habe eine Klasse, die zur Erstellung eines Diagramms dient.
Dieses Diagramm soll später in einem Label auf meinem MainFrame erscheinen.
Ich frage mich, wie ich das Diagramm implementiert bekomme...
Java:
public class DiagrammClass extends JFrame {
public XYSeries s1;
public XYSeries s2;
public XYSeries s3;
public XYSeriesCollection dataset;
public JFreeChart chart;
private static final long serialVersionUID = 1L;
/**
*
* Erzeugt ein Objekt der Klasse DiagrammClass
*
* @param title
* @Konstruktor Konstruktor der Klasse
*/
public DiagrammClass(String title) {
super(title);
}
public void closeOperation(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
}
);
}
public void formWindowClosed(WindowEvent evt){
// Auswahlfelder JA oder NEIN
Object[] options = { "Ja", "Nein" };
// Speichert das Case
int wahl;
// Initialisiert das Option Dialog
wahl = JOptionPane.showOptionDialog(this,
"Möchten Sie das Programm beenden?", "",
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, options, null);
// Wenn Wahl auf 0 gesetzt ist, dann...
if (wahl == 0) {
// Beenden des Programms
System.exit(10);
} else {
setDefaultCloseOperation(MainFrames.DO_NOTHING_ON_CLOSE);
}
}
/**
* Startet die Erstellung des Diagramms
*
* @param daten
* @param count
*/
public void aktualisieren( String[][] daten, int count){
JPanel chartPanel = diaErstellen(daten, count);
chartPanel.setPreferredSize(new Dimension(500, 270));
this.setSize(400, 400);
this.setLocation(500, 0);
}
/**
* Methode, die einzelne Methoden aufruft für die
* Erstellung des Diagramms
*
* @param daten
* @param count
* @return returnValue (JPanel)
*/
public JPanel diaErstellen(String[][] daten, int count) {
initXYSeries();
xYSeriesFuellen(daten,count);
initChart();
JPanel returnValue = diagramErstellen();
return returnValue;
}
/**
* Initalisiert die Objekte für die Datensammlung der Diagramm-Werte
*/
public void initXYSeries() {
s1 = new XYSeries("Rot");
s2 = new XYSeries("Blau");
s3 = new XYSeries("Gruen");
}
/**
* Serien mit Daten füllen...
*/
public void xYSeriesFuellen(String[][] daten, int count) {
for (int i = 0; i <= count; i++) {
for (int j = 0; j < daten[i].length; j++) {
double zeitFaktor = berechnungbVergangeneZeit(i);
// Wenn H vorkommt, ist der Blau-Wert im String enthalten
if (daten[i][j].contains("H")
&& daten[i][j].length() ==5) {
s2.add(zeitFaktor, hexaInDezi(daten[i][j].substring(2, 4))); //Blaue Farbe
}
// Wenn L vorkommt, ist der Gruen- und Rot-Wert enthalten
else if (daten[i][j].contains("L")
&& daten[i][j].length() ==5) {
s3.add(zeitFaktor, hexaInDezi(daten[i][j].substring(0, 2))); //Gelbe Farbe
s1.add(zeitFaktor, hexaInDezi(daten[i][j].substring(2, 4))); //Rote Farbe
}
}
}
dataset = new XYSeriesCollection();
dataset.addSeries(s1);
dataset.addSeries(s2);
dataset.addSeries(s3);
}
public double berechnungbVergangeneZeit(int counter){
double zeitPunkt = counter * 0.166;
return zeitPunkt;
}
/**
* Konvertiert die Hexadezimalwerte in Dezimalwerte
* @param kalibrierungsWert
* @return
*/
public int hexaInDezi(String kalibrierungsWert) {
int deziWerte = Integer.parseInt(kalibrierungsWert, 16);
return deziWerte;
}
/**
* Initalisierung des Chart's
*/
public void initChart() {
chart = ChartFactory.createXYLineChart("RGB-Werte", // Überschrift der Applikation
"Datensatz", // Achsen
"Werte", // Achsen
dataset, // Datensammlung
PlotOrientation.VERTICAL,
true, // Legende soll angezeigt werden
false,
false);
}
/**
* Erstellt den tatsächlichen Plot
*
* @return chartPanel (ChartPanel)
*/
public ChartPanel diagramErstellen() {
XYPlot plot = chart.getXYPlot();
NumberAxis xAchse = new NumberAxis("Zeit in Min.");
NumberAxis yAchse = new LogarithmicAxis("Dezimalwert");
plot.setDomainAxis(xAchse);
plot.setRangeAxis(yAchse);
chart.setBackgroundPaint(Color.white);
plot.setOutlinePaint(Color.gray);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
return chartPanel;
}
}
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package package_ConnectionRSL20Serial;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/**
* @author Lukas
*/
public class MainFrames extends javax.swing.JFrame {
// Deklarationen
private static final long serialVersionUID = 1L;
//Variable für den ausgelagerten Task
public MainFrames main;
//Variable zur Erzeugung der Ordnerstruktur
private File ordner;
//Variablen die direkt mit dem Kalibrierungsablauf verbunden sind
public KalibrierungsAblaufRSL kalibrierungRSL;
public ArrayList<KalibrierungsAblaufRSL> sammlungAllerKalibs =
new ArrayList<KalibrierungsAblaufRSL>();
//Variablen vom Typ Boolean
public boolean unsichtbar = false;
public boolean sichtbar = true;
//Variablen vom Tyo statische String's
public static String value;
public static String pathFile;
public static String PATHORDNER = "C:\\KalibrierungRSL";
/**
* Creates new form Versuch
*/
public MainFrames() {
// Anlegen der Ordnerstruktur, falls nicht vorhanden
ordner = new File("C:\\KalibrierungRSL");
ordner.mkdir();
//Variable main, dieses Frame hinzufügen
main = this;
//Setzt den Titel des Frames
setTitle("Kalibrierungs-Tool RSL");
//Initialisiert die Standard-Komponenten
initComponents();
initSpecials();
}
/**
* Methode für spezielle Anzeigen
*
* @param image
*/
public final void initSpecials() {
//Setzt den Anfangswert
spinnerKalibrierungsZeitraum.setValue(30);
}
/**
* Initialisiert und lässt das Diagramm erscheinen
*/
public void diagrammInitialisieren(){
}
/**
* Methode initalisiert, positioniert und richtet die einzelnen
* Komponenten im Frame exakt aus
*/
private void initComponents() {
//QUELLCODE entfernt
}
/**
* Startet die Kalibrierung
* Die Kalibrierung selbst wurde in eine separate Task-Klasse ausgelagert, weil
* ansonsten das MainFrame einfriert und sich nicht mehr bedienen lässt
*
* @param evt
* @throws IOException
* @throws InterruptedException
*/
private void menuItemKalibrierungStartenActionPerformed(
java.awt.event.ActionEvent evt) throws IOException,
InterruptedException {// GEN-FIRST:event_menuItemKalibrierungStartenActionPerformed
// Speichert alle Werte am Schluss
final ArrayList<Object> alleComSchnittstellen = new ArrayList<Object>();
// Sammelt die Werte der Listen
alleComSchnittstellen.addAll(Arrays.asList(listeCOM1bis4.getSelectedValues()));
alleComSchnittstellen.addAll(Arrays.asList(listeCOM5bis9.getSelectedValues()));
alleComSchnittstellen.addAll(Arrays.asList(listeCOM9bis12.getSelectedValues()));
alleComSchnittstellen.addAll(Arrays.asList(listeCOM13bis16.getSelectedValues()));
// Laufzeit wird gesetzt, hängt vom Spinner der Kalib.Zeit ab
final int laufzeit = (Integer) spinnerKalibrierungsZeitraum.getValue();
// Wenn die Größe von alleObjekte == 0 ist, dann keine Verbindung
// herstellen
if (alleComSchnittstellen.isEmpty()) {
//Zeigt die Com-Schnittstellen an
JOptionPane.showMessageDialog(this,
"Sie haben keine COM-Schnittstelle gewählt",
"!! Warnung !!", JOptionPane.ERROR_MESSAGE);
} else {// Wenn es nicht leer ist, verbindung herstellen
JOptionPane.showMessageDialog(this, "Kalibrierung gestartet: "
+ alleComSchnittstellen.toString() + " Laufzeit: "
+ laufzeit + "min. ");
KalibrierungsThread[] threads = new KalibrierungsThread[alleComSchnittstellen.size()];
//Für alle Schnittstellen die ausgewählt wurden, muss auch ein
//Kalibrierungsablauf gestartet werden
for (int i = 0; i < alleComSchnittstellen.size(); i++) {
//Erzeugt ein neuen Thread, damit das Fenster nicht einfriert
threads[i] = new KalibrierungsThread(
alleComSchnittstellen.get(i).toString(), laufzeit,this);
threads[i].start();
}
}
}
/**
* Erstellt und öffnet das Shortcut-Fenster
*
* @param evt
*/
private void menuItemHilfeActionPerformed(java.awt.event.ActionEvent evt) {
// Erzeugung eines neuen Objektes vom Typ HilfeFrame
ShortcutsFrame hilfe = new ShortcutsFrame(this);
// Setzen des Titels des Frames
hilfe.setTitle("Hier wird Ihnen geholfen...");
// Das Frame wird sichtbar gemacht
hilfe.setVisible(sichtbar);
// Groese des Frames wird an die Komponenten angepasst
hilfe.pack();
// MainFrame wird unsichbar gemacht
this.setVisible(unsichtbar);
}
/**
* Öffnet den Ordner, indem sich die Textdateien befinden
* Fehler werden abgefangen
* @param evt
*/
private void menuItemOrdnerOeffnenActionPerformed(
java.awt.event.ActionEvent evt) {
try {
//Explorer mit dem angegebene Pfad
Runtime.getRuntime().exec("explorer.exe " + PATHORDNER);
} catch (IOException ex) {
//Fehler wenn Ordnerstrucktur nicht angelegt werden konnte
JOptionPane.showMessageDialog(this,"Ordnerstruktur konnte nicht angelegt werden...");
}
}
/**
* Es erscheint ein Auswahlfeld aller Dateien die im
* Kalibrierungslauf bisher erzeugt wurden! Jetzt kann einfach per Klick die
* gewünschte Datei ausgewählt werden, diese Datei wird anschließend
* geöffnet.
*
* @param evt
* @throws IOException
*/
private void menuItemTextfileOeffnenActionPerformed(
java.awt.event.ActionEvent evt) throws IOException {
// Initialisiert einen FileChooser
JFileChooser chooser = new JFileChooser(PATHORDNER);
// Erlaubt nur das Selektiern von Dateien
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
// Öffnet das Open-Dialog
int oeffnenGedrueckt = chooser.showOpenDialog(this);
// Wenn Button gedrückt, dann...
if (oeffnenGedrueckt == JFileChooser.APPROVE_OPTION) {
// Selektierte Datei soll geöffnet werden
Runtime.getRuntime().exec(
"notepad.exe "
+ chooser.getSelectedFile().getAbsolutePath());
}
}
/**
* Es erscheint dem Enduser ein Auswahlfeld aller Dateien die im
* Kalibrierungslauf bisher erzeugt wurden! Jetzt kann einfach per Klick die
* gewünschte Datei ausgewählt werden, diese Datei wird anschließend
* gelöscht.
*
* @param evt
*/
private void menuItemTextfileLoeschenActionPerformed(
java.awt.event.ActionEvent evt) {
//Neuer FileChooser wird erstellt, mit dem Pfad auf den Ordner der Textdateien
JFileChooser chooser = new JFileChooser(PATHORDNER);
//Überprüfung ob Textfile auch wirklich gelöscht wurde
int loeschenGedrueckt = chooser.showDialog(this, "Löschen");
//Wenn wirklch gelöscht werden soll...
if (loeschenGedrueckt == JFileChooser.APPROVE_OPTION) {
//Wenn File wirklich gelöscht wurde, dann...
boolean geloescht = chooser.getSelectedFile().delete();
if (geloescht) {
//Message Dialog ausgeben
JOptionPane.showMessageDialog(this, "File gelöscht");
} else {
//Message Dialog ausgeben
JOptionPane.showMessageDialog(this,
"File konnte nicht gelöscht werden");
}
}
}
/**
* Wenn der Button Programm beenden im Menü ausgewählt wird, wird abgefragt
* ob wirklich beendet werden soll, ist dies der Fall, wird beendet
* andernfalls das Event nicht gehandelt
*
* @param evt
*/
private void menuItemProgrammBeendenActionPerformed(
java.awt.event.ActionEvent evt) {
// Auswahlfelder JA oder NEIN
Object[] options = { "Ja", "Nein" };
// Speichert das Case
int wahl;
// Initialisiert das Option Dialog
wahl = JOptionPane.showOptionDialog(this,
"Möchten Sie das Programm beenden?", "",
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, options, null);
// Wenn Wahl auf 0 gesetzt ist, dann...
if (wahl == 0) {
// Beenden des Programms
System.exit(10);
}
}
/**
* Beendet die Verbindung zu einem Gerät, falls ein Fehler aufgetreten ist
*
* @param evt
* @throws IOException
*/
private void menuItemDisconnectActionPerformed(
java.awt.event.ActionEvent evt) throws IOException {
//Schleife über alle Kalibrierungsabläufe
for (int i = 0; i < sammlungAllerKalibs.size(); i++) {
/**
*Unterbricht die Verbindung zur ausgewählten Com-Schnittstelle
*/
if (sammlungAllerKalibs.get(i).getPortname() == listeCOM1bis4
.getSelectedValue()) {
sammlungAllerKalibs.get(i).disconnect();
} else if (sammlungAllerKalibs.get(i).getPortname() == listeCOM5bis9
.getSelectedValue()) {
sammlungAllerKalibs.get(i).disconnect();
} else if (sammlungAllerKalibs.get(i).getPortname() == listeCOM9bis12
.getSelectedValue()) {
sammlungAllerKalibs.get(i).disconnect();
}
}
}
/**
* Klasse leitet das ActionEvent zu einer anderen Methode weiter
*
* @method menuItemKalibrierungStartenActionPerformed(evt)
* @param evt
* @throws IOException
* @throws InterruptedException
*/
private void btnKalibrierungStartenActionPerformed(
java.awt.event.ActionEvent evt) throws IOException,
InterruptedException {
// Aufruf der Methode, ActionEvent wird weiter gegeben
menuItemKalibrierungStartenActionPerformed(evt);
}
/**
* Diese Methode überprüft, ob der User das Programm auch
* wirklich beenden möchte oder nicht
* @param evt
*/
private void formWindowClosing(java.awt.event.WindowEvent evt) {
// Auswahlfelder JA oder NEIN
Object[] options = { "Ja", "Nein" };
// Speichert das Case
int wahl;
// Initialisiert das Option Dialog
wahl = JOptionPane.showOptionDialog(this,
"Möchten Sie das Programm beenden?", "",
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, options, null);
// Wenn Wahl auf 0 gesetzt ist, dann...
if (wahl == 0) {
// Beenden des Programms
System.exit(10);
} else {
setDefaultCloseOperation(MainFrames.DO_NOTHING_ON_CLOSE);
}
}// GEN-LAST:event_formWindowClosing
/**
* Startet das Programm
* @param args
*/
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager
.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(MainFrames.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(MainFrames.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(MainFrames.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(MainFrames.class.getName()).log(
java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrames().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel Optionen;
private javax.swing.JPanel Plot;
private javax.swing.JButton btnKalibrierungStarten;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JPanel hilfePanel;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JScrollPane scrollPaneListe13bis16;
[B]public JLabel lblChartAnzeige;[/B]
private javax.swing.JTabbedPane tabPlot;
private javax.swing.JTextArea infoTextHilfeOben;
private javax.swing.JTextArea infoTextHilfeUnten;
private javax.swing.JLabel lblKalibZeit;
private javax.swing.JLabel lblPlotCOM;
private javax.swing.JLabel lblPlotSchnittstelleAuswahl;
private javax.swing.JLabel lblTelefonNummer;
private javax.swing.JLabel lblUeberschrift;
private javax.swing.JLabel lblUeberschriftHilfeTab;
private javax.swing.JList listeCOM13bis16;
private javax.swing.JList listeCOM1bis4;
private javax.swing.JList listeCOM5bis9;
private javax.swing.JList listeCOM9bis12;
private javax.swing.JMenuItem menuItemHilfe;
private javax.swing.JMenuItem menuItemVerbindungBeenden;
private javax.swing.JMenuItem menuItemKalibrierungStarten;
private javax.swing.JMenuItem menuItemOrdnerOeffnen;
private javax.swing.JMenuItem menuItemProgrammBeenden;
private javax.swing.JMenu menuItemTextdatei;
private javax.swing.JMenuItem menuItemTextfileLoeschen;
private javax.swing.JMenuItem menuItemTextfileOeffnen;
private javax.swing.JMenu menuItemUebersicht;
private javax.swing.JPanel plotDiagrammFeld;
private javax.swing.JSpinner spinnerKalibrierungsZeitraum;
private javax.swing.JTabbedPane tabAuswahl;
private javax.swing.JSeparator trennStrich1;
private javax.swing.JSeparator trennStrich2;
private javax.swing.JSeparator trennStrich3;
// End of variables declaration//GEN-END:variables
/**
* Klasse die einen neuen Thread erstellt und in
* dieser Klasse den Kalibrierungsablauf anstößt
* @author adlerlu
*
*/
class KalibrierungsThread extends Thread {
//Speichert der Portnamen
String portName;
//Gibt die durchLaufzeit an
int durchLaufzeit;
//Wenn Stop gesetzt
boolean stop;
/**
* Konstruktor zur Erzeugung eines Thread Objekts
* @param portname
* @param laufzeit
*/
public KalibrierungsThread(String portname, int laufzeit, MainFrames main) {
this.portName = portname;
this.durchLaufzeit = laufzeit;
}
@SuppressWarnings("deprecation")
public void run() {
try {
//Erstellt ein neues Objekt vom Typ Kalibrierungsablauf
kalibrierungRSL= new KalibrierungsAblaufRSL(portName,
durchLaufzeit,main);
//Sammlung alelr Kalibs, wird gefüllt mit dem Objekt von kalibrierungsRSL
sammlungAllerKalibs.add(kalibrierungRSL);
//Kalibrierung wird gestartet
stop = kalibrierungRSL.anschalten(durchLaufzeit);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (stop) {
JOptionPane.showMessageDialog(main, "Textfile erstellt: "
+ kalibrierungRSL.getPortname());
this.stop();
}
}
}
}
-> Also wie ihr vielleicht gesehen habt, will ich das erzeugte Diagramm der Diagramm-Klasse im FETT-hinterlegten Label der MainFrame Klasse anzeigen lassen.
-> Ist das möglich? (Wenn Ja, wie?)
-> Wenn nicht möglich, was muss ich machen, damit ich es trotzdem in meinem Tab anzeigen lassen kann...