Zeichen auf mehrere JPanels

Jats

Aktives Mitglied
Hi,

ich arbeite momentan an einem Projekt zur Darstellung von gedämpften Schwingkreisen, in Form von einem Graph in einem Koordinatensystem. Das ganze funktioniert auch wunderbar, jedoch will ich nun versuchen alle Diagramme nacheinander zu zeichnen, und das in einer paint-Methode, auf vier verschiedenen JPanels welche nebeneinander angezeigt werden sollen.

Hier habe ich ein Umsezungsbeispiel, wobei ich den Großteil des Codes rausgenommen habe:

Java:
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

public class GUI extends JFrame implements ActionListener, ChangeListener {
    private String [] tNames = {"r","l","c","ende","w0","w","alpha"}, lNames = {"R:","C:","L:","w0:","w:","@:","Werte Insgesamt:"}, bNames = {"Berechnen","Zeichnen","Werte anzeigen"};/*W\ne\nr\nt\ne\n a\nn\nz\ne\ni\ng\ne\nn*/
    private JTextField [] textfields = new JTextField[tNames.length];
    private JLabel [] labels = new JLabel[lNames.length];
    private JButton [] buttons = new JButton[bNames.length];
    private WerteErzeugen werteErzeugen = new WerteErzeugen(2500);

    private Diagramm [] diagramme;

    private JPanel [] panels = new JPanel[4];
    
    private double [] xSkala,ySkala,xWerte,yWerte;
    private double [][] graphen;

    private boolean ausgeklappt = false;
    public GUI() {
        super("Schwingkreiss*****");
        setSize(1285,540);
        setLocation(2,100);
        setDefaultCloseOperation(3);
        setResizable(true);
        setLayout(null);

        werteErzeugen.berechnen();
        diagramme = werteErzeugen.getDiagramme();
        
        for(int i = 0; i<4; i++) {
            panels[i] = new JPanel();
            panels[i].setSize(300,200);
            add(panels[i]);
            panels[i].setVisible(true);
        }

        int buttonX = 30, buttonY = 450;
        for(int i=0; i<bNames.length-1; i++) {
            buttons[i] = new JButton(bNames[i]);
            buttons[i].setBounds(buttonX,buttonY,100,20);
            add(buttons[i]);
            buttons[i].addActionListener(this);
            buttonY+=20;
        }
        buttons[2] = new JButton(bNames[2]);
        buttons[2].setBounds(592,465,200,40);
        add(buttons[2]);
        buttons[2].addActionListener(this);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if(o==buttons[0]) {
            werteErzeugen.berechnen();
        }
        if(o==buttons[1]) {
            paint(panels[0].getGraphics());
            paint(panels[1].getGraphics());
        }
        if(o==buttons[2]) {
            if(!ausgeklappt) {
                setSize(getWidth(),getHeight()+240);
                s.setBounds(0,505,1270,505);
                add(s);
                s.setVisible(true);
                ausgeklappt = true;
                extraInfo();
            }
            else {
                setSize(getWidth(),getHeight()-240);
                s.setVisible(false);
                ausgeklappt = false;
            }
        }
    }

    public void setSkalaUndPunkte(Diagramm d) {
        double [][] v = d.getWerte();
        xWerte = new double[v[0].length];
        yWerte = new double[v[1].length];
        xSkala = new double[v[2].length];
        ySkala = new double[v[3].length];

        xWerte = v[0];
        yWerte = v[1];
        xSkala = v[2];
        ySkala = v[3];
    }

    public void paint(Graphics g) {
        diagramme = werteErzeugen.getDiagramme();
        setSkalaUndPunkte(diagramme[0]);
        super.paint(g);
        //g = zeichenPanel.getGraphics();
        g = panels[0].getGraphics();
        g.clearRect(0,0,getWidth(),getHeight());

        int h = 300;    //(int) (getHeight() * 0.7);
        int w = 200;    //(int) (getWidth() * 0.6);
        int x0 = 40;    //(int) (0.1 * getWidth());          
        int y0 = 350;   //(int) (0.9 * getHeight());#
        diagrammNummer = 0;
        
        //while(diagrammNummer<=diagramme.length) {
            panels[diagrammNummer].setBounds(x0,50,270,400);
            g = panels[0].getGraphics();
           
            g.drawString(diagramme[diagrammNummer].getName(),x0+140,45);
            g.setColor(Color.BLACK);

            g.drawLine(x0,y0-h-15,x0,y0);            //y-Achse
            g.drawLine(x0-1,y0-h-15,x0-1,y0);

            g.drawLine(x0,y0,x0+w+15,y0);            //x-Achse
            g.drawLine(x0,y0+1,x0+w+15,y0+1);

            g.drawString("y",x0+5,y0-h-5);          //Achsenbeschreibung
            g.drawString("x",x0+w+7,y0-3);          //Achsenbeschreibung

            g.drawLine(x0-5,y0-h-15,x0+5,y0-h-15);  //y-Achse Pfeilgrund          
            g.drawLine(x0-5,y0-h-15,x0,y0-h-20);    //|
            g.drawLine(x0+5,y0-h-15,x0,y0-h-20);    //|     Pfeil
            g.drawLine(x0-4,y0-h-15,x0,y0-h-20);    //|
            g.drawLine(x0+4,y0-h-15,x0,y0-h-20);    //|

            g.drawLine(x0+w+15,y0-5,x0+w+15,y0+5);  //x-Achse Pfeilgrund 
            g.drawLine(x0+w+15,y0-5,x0+w+20,y0);    //|
            g.drawLine(x0+w+15,y0+5,x0+w+20,y0);    //|     Pfeil
            g.drawLine(x0+w+15,y0-4,x0+w+20,y0);    //|
            g.drawLine(x0+w+15,y0+4,x0+w+20,y0);    //|

            for (int i = 0;i<=xSkala[2];i++) {
                g.drawString("" + (xSkala[0]+i*((xSkala[1]-xSkala[0])/xSkala[2])),(int)(x0+i*w/xSkala[2]),y0+20);                //Beschriftung xAchse
            }
            for (int i = 0;i<=ySkala[2];i++) {
                g.drawString("" + (ySkala[0]+i*(ySkala[1]-ySkala[0])/ySkala[2]),x0-40,(int)(y0+4-i*h/ySkala[2]));              //Beschriftung yAchse
            }  
            g.setColor(Color.GRAY);
            for (int i = 0; i<=xSkala[2]; i++) {
                g.drawLine ((int)(x0+(i*w/xSkala[2])),y0,(int)(x0+(i*w/xSkala[2])),y0-h);                                                         //Gitternetz yAchse
            }
            for (int i = 0; i<=ySkala[2]; i++) {
                g.drawLine (x0,(int)(y0-(i*h/ySkala[2])),x0+w,(int)(y0-(i*h/ySkala[2])));                                                         //Gitternetz xAchse
            }
            g.setColor(Color.BLACK);
            for(int i = 0;i<xWerte.length;i++) {
                g.fillOval((int)(x0-1+w*(xWerte[i]-xSkala[0])/(xSkala[1]-xSkala[0])),(int)(y0-1-(h*(yWerte[i]-ySkala[0])/(ySkala[1]-ySkala[0]))),3,3);
            }
            x0 = w+x0+100;
            diagrammNummer++;
            if(diagrammNummer!=diagramme.length) {
                setSkalaUndPunkte(diagramme[diagrammNummer]);
            }
            else {
                break;
            }
            g = panels[diagrammNummer].getGraphics();
        }
    }
}

Problem ist momentan folgendes: Wenn ich repaint() aufrufe, wird zwar alles gezeichnet, das jedoch nur auf ein JPanel und ich weiß auch nicht welches. Es scheint also, als würde g = panels.getGraphics(); nicht so funktionieren, wie ich will. Ich habe auch schon versucht, an den Stellen an denen ich repaint() aufrufe einfach paint(panels.getGraphics()) zu machen, aber das ging auch nicht.

Meine Frage ist jetzt, ob meine Idee überhaupt möglich ist, oder nicht und wenn ja, wie. Bitte entschuldigt meine relativ unsaubere Programmierweise, die Feinarbeit folgt meist erst nachher.

Gruß,
Jats
 

jgh

Top Contributor
imho ist das gerade vergebene Mühe, was du machst.

Du überschreibst die
Code:
 paint(Graphics g)
Methode des JFrames und rufst wild auf deine JPanels
Code:
getGraphics()
auf. Dass das irgendwann so funktioniert, wie du dir das vorstellst....kann ich mir nicht vorstellen.

Warum willst du denn überhaupt über mehrere Panels zeichnen? Und dann im Null-Layout? Während deine Panels zumindest laut dem geposteten Code das FlowLayout haben...!!! Da du die Klassen WerteErzeugen und Diagramm nicht gepostet hast, lässt sich dein prog leider nicht kompilieren.

paar Schlagwörter...: Null-Layout is Evil (ok, bei den Diagrammen lässt sich das evtl nicht umgehen)
niemals selbst paint() aufrufen...
niemals getGraphics() aufrufen, außer man weiß was man macht^^
 

Jats

Aktives Mitglied
imho ist das gerade vergebene Mühe, was du machst.

Du überschreibst die
Code:
 paint(Graphics g)
Methode des JFrames und rufst wild auf deine JPanels
Code:
getGraphics()[/C auf. Dass das irgendwann so funktioniert, wie du dir das vorstellst....kann ich mir nicht vorstellen.
[/QUOTE]

Schon klar, ich müsste mir dann erst sowas wie ne MyPanel Klasse machen und da dann paint(-Component) überschreiben, aber ich will das im JFrame haben und eigentlich nicht noch mehr Klassen machen.

[quote="jgh, post: 907536"]Warum willst du denn überhaupt über mehrere Panels zeichnen? Und dann im Null-Layout? Während deine Panels zumindest laut dem geposteten Code das FlowLayout haben...!!!  Da du die Klassen WerteErzeugen und Diagramm nicht gepostet hast, lässt sich dein prog leider nicht kompilieren.[/QUOTE]

Null-Layout habe ich deshalb gewählt, weil ich mit Flow-, Box- und irgendeinem anderen Layout noch nie wirklich gearbeitet habe und das ganze Projekt relativ schnell fertig werden sollte, weshalb ich eigentlich auf etwas Neues verzichten wollte.

EDIT: Paint direkt aufrufen war auch nur ein Versuch, in Verzweiflung, das war jetzt nicht wirklich als funktionierend geglaubt. Ich probiere halt viel rum, wenn was nicht auf Anhieb geht :D Zu getGraphics(): Macht doch nix anderes, als ein Graphics-Objekt von der Komponente zu erstellen, oder ist es doch nicht so einfach ?
Ich will deshalb auf mehrere JPanels zeichnen, weil ich den Zeichenprozess, also im Prinzip die Abnahme der Schwingung zeigen will, sprich mit nem Timer, dass die Kurve also beim entstehen gesehen wird und nicht einfach so da ist. Die Sache mit mehreren JPanels war die Idee vom Dozenten, ich wollte das nur mal so ausprobieren, wenn's nicht klappt würde ich auch was anderes versuchen.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Zu getGraphics(): Macht doch nix anderes, als ein Graphics-Objekt von der Komponente zu erstellen, oder ist es doch nicht so einfach ?
Nein so einfach ist das nicht. Rufst du getGraphics() auf bevor die Komponente sichtbar ist bekommst du bspw. null zurück. Auch wenns dann mal irgendwann klappen sollte ist es nicht sehr unwahrscheinlich dass dir immer mal Zeichenfehler auffallen.

Wann gezeichnet wird entscheidet ausschließlich Swing, das brauchst du nicht tun. Daher: In der paintComponent() vom JPanel deine Sachen zeichnen die du zeichnen willst. Per repaint() kannst du Java darum bitten nochmal alles neuzuzeichnen.
 

Jats

Aktives Mitglied
Nein so einfach ist das nicht. Rufst du getGraphics() auf bevor die Komponente sichtbar ist bekommst du bspw. null zurück. Auch wenns dann mal irgendwann klappen sollte ist es nicht sehr unwahrscheinlich dass dir immer mal Zeichenfehler auffallen.

Wann gezeichnet wird entscheidet ausschließlich Swing, das brauchst du nicht tun. Daher: In der paintComponent() vom JPanel deine Sachen zeichnen die du zeichnen willst. Per repaint() kannst du Java darum bitten nochmal alles neuzuzeichnen.

Alles klar, Ersteres wusste ich schon, aber Zweiteres hilft mir glaub ich weiter.
Jetzt ist nur die Frage, wie ich das mit der paintComponent() von JPanel machen soll, ich meine..wie soll ich die vom JPanel überschreiben ?
Soll ich ne neue Klasse die von JPanel erbt erstellen und die paintComponent() darin überschreiben oder was ?
 

bERt0r

Top Contributor
Noch was: Anstatt mit Null Layout rumzuprobieren wärst du vermutlich sehr viel schneller, wenn du lernst mit einem Layoutmanager umzugehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Swing Tastatur zeichen AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Zeichen werden über unabhängingen JRadioButton nicht gefüllt AWT, Swing, JavaFX & SWT 28
I JOptionPane maximale Zeichen einstellen AWT, Swing, JavaFX & SWT 2
L JavaFX ASCII Zeichen /char von KeyEvent erhalten AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
C JavaFX Tiefgestellte Zeichen in fxml AWT, Swing, JavaFX & SWT 2
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
L Ausgabe in JEditorPane mittels HTMLEditorKit zeigt auf bestimmten Systemen falsche Zeichen AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
A Zeichen-Steuerelement in Swing AWT, Swing, JavaFX & SWT 0
kaoZ Swing Aktives Zeichen für Spieleprogrammierung ? AWT, Swing, JavaFX & SWT 8
D Swing Manuellen Kreis zeichen AWT, Swing, JavaFX & SWT 22
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
R einzelne Zeichen in jTable einlesen AWT, Swing, JavaFX & SWT 10
S SWT [TextBox] Bestimmtes Zeichen entfernen unterbinden AWT, Swing, JavaFX & SWT 3
P readLine solange es mit einem bestimmten Zeichen anfängt AWT, Swing, JavaFX & SWT 5
P Komische Zeichen beim Abspeichern von TextFelder AWT, Swing, JavaFX & SWT 2
P 2D-Grafik versch. Rectangles aus array von textfelder zeichen AWT, Swing, JavaFX & SWT 6
DEvent Swing JTextField Anzahl an sichtbaren Zeichen AWT, Swing, JavaFX & SWT 4
D JLabel und JPanel -> Neu zeichen?! oO AWT, Swing, JavaFX & SWT 2
E jTextFiled max 160 Zeichen? AWT, Swing, JavaFX & SWT 4
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
A Rechteck zeichen AWT, Swing, JavaFX & SWT 4
Q AWT Choice ein Zeichen hinzufügen AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Textbasiertes 2D Spiel, jedes Zeichen manipulierbar AWT, Swing, JavaFX & SWT 7
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
T Zeichen/char in Bild umwandeln und darstellen AWT, Swing, JavaFX & SWT 10
2 Bücher über Zeichen und Baumalgorithmen AWT, Swing, JavaFX & SWT 5
T Zeichen zählen JTextPane AWT, Swing, JavaFX & SWT 4
F Zeichen per Menuitem funktioniert nicht AWT, Swing, JavaFX & SWT 2
V Nur zulässige Zeichen in JTable-Zellen eintragen können AWT, Swing, JavaFX & SWT 2
P Swing Probleme beim Zeichen AWT, Swing, JavaFX & SWT 6
aze JTextfield nur so breit dass alle zeichen sichtbar sind AWT, Swing, JavaFX & SWT 2
3TageBart Ebenen in Zeichen-Programm implementieren AWT, Swing, JavaFX & SWT 9
P Zeichen abhängig davon, ob sich eine Variable geändert hat AWT, Swing, JavaFX & SWT 2
G Blinkenden Punkt zeichen AWT, Swing, JavaFX & SWT 2
G Viele Fehler beim zeichen AWT, Swing, JavaFX & SWT 5
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
J jTextarea Anzahl Zeichen in einer Zeile begrenzen AWT, Swing, JavaFX & SWT 2
Lazybone CMYK Zeichen AWT, Swing, JavaFX & SWT 12
H Polyline zeichen, aber wie? AWT, Swing, JavaFX & SWT 2
D jTable ausdrucken => € zeichen wird nicht richtig angezei AWT, Swing, JavaFX & SWT 7
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K UNICODE ZEICHEN in den SWing-GUIs AWT, Swing, JavaFX & SWT 4
B Dreiecke zeichen AWT, Swing, JavaFX & SWT 3
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
C JFormattedTextField - nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 3
F Zeichen von Linien, Rechtecken, zb wie in paint AWT, Swing, JavaFX & SWT 2
B Zeichen werden im JFormattedTextField überschrieben AWT, Swing, JavaFX & SWT 3
C PI-Zeichen im JLabel AWT, Swing, JavaFX & SWT 3
G Zeilenumbruch nach n Zeichen in JTextArea AWT, Swing, JavaFX & SWT 24
U kleiner-Zeichen JEditorPanel (war: JOptionPane) AWT, Swing, JavaFX & SWT 5
T JLayerdPane: wie etwas über eine AWT Komponente zeichen? AWT, Swing, JavaFX & SWT 2
N Tastatur Zeichen einlesen ohne sichtbares Fenster AWT, Swing, JavaFX & SWT 8
D JTextPane: "Nichtdruckbare Zeichen" anzeigen & AWT, Swing, JavaFX & SWT 4
R letztes Zeichen aus textfeld auslesen AWT, Swing, JavaFX & SWT 2
M rendern von zeichen AWT, Swing, JavaFX & SWT 4
R Zeichen-Markierungrahmen AWT, Swing, JavaFX & SWT 5
F Eingabe in JPasswordField auf vier Zeichen beschränken AWT, Swing, JavaFX & SWT 3
M Transparentes gif als extra Klasse auf einen JFrame zeichen AWT, Swing, JavaFX & SWT 17
B ComboBox: nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 5
G Linien in ein Koordinatensystem zeichen AWT, Swing, JavaFX & SWT 7
H funktionen in ein koordinatensystem zeichen AWT, Swing, JavaFX & SWT 5
B Erstes Zeichen in einem String toUpperCase ??? AWT, Swing, JavaFX & SWT 4
bummerland ein zeichen nach einem zeilenumbruch einfügen AWT, Swing, JavaFX & SWT 4
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
I Scene Builder - mehrere Seiten AWT, Swing, JavaFX & SWT 6
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
temi JavaFX Mehrere Views mit Stage.setScene() oder mit Scene.setRoot()? AWT, Swing, JavaFX & SWT 7
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
T Swing Tetraeder - mehrere Punkte verbinden? - Ansätze gesucht AWT, Swing, JavaFX & SWT 2
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben