Swing paintComponent, JPanel auslagern, ChangeEvents

keinguru

Mitglied
Hi,
ich bin im Begriff, mein Verständnis der GUI-Programmierung zu vertiefen, und versuche in diesem Zusammenhang, innere oder anonyme Klassen explizit zu machen.
Ich habe im folgenden 3 Klassen (jeweils in separaten Dateien):
DynaGeraden - der Einstiegspunkt
MyPanel - die GUI
GPanel - ein JPanel; der Versuch, die Zeichenfläche auszulagern

DynaGeraden funktioniert in Verbindung mit MyPanel wunderbar.
Meine Frage:
Warum funktioniert
Java:
graphPanel = new GPanel(breite, hoehe, A,B, xmin, xmax,  ymin, ymax,  a, b) ;
(unten Zeile 83 versus Zeilen 85ff ) in Verbindung mit der Klasse GPanel nicht? Wie kann ich die anonyme Klasse aus Zeile 85ff auslagern?
Nochmal anders gefragt: Warum wird in der Version mit
Java:
graphPanel = new GPanel(breite, hoehe, A,B, xmin, xmax,  ymin, ymax,  a, b) ;
das innere Panel nicht von den ChangeEvents erreicht?
Wie gesagt, es geht nicht um die Frage, ob das performant oder sinnvoll ist, ich will nur verstehen, warum es (nicht) funktioniert.

Danke, Steffen.

Java:
//////////////// DynaGeraden.java
import java.awt.EventQueue;
import javax.swing.JFrame;
public class DynaGeraden 
{
    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() 
            {
                JFrame frame = new JFrame("Gerade");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new MyPanel());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }//main
}//class


/////////////////// MyPanel.java

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


@SuppressWarnings("serial")
class MyPanel extends JPanel implements ChangeListener
{
	static int breite= 1400;
    static int hoehe  = 700;
    static int A =  1;
    static int B =  1;
    static double xmin = -10;
    static double xmax =  10;
    static double ymin = -15;
    static double ymax =  15;
    double a, b;

    private Box controls;
    private JPanel graphPanel;
    private JSlider aSlider, bSlider;
    private JLabel aLabel, bLabel;

	public MyPanel() 
    {

    	aSlider=new JSlider(JSlider.HORIZONTAL, -100, 100, 1);
        aSlider.setPaintTicks(true);
        aSlider.setMajorTickSpacing(50);
        aSlider.setMinorTickSpacing(25);
        aSlider.setPaintLabels(true);
    	
    	bSlider=new JSlider(JSlider.HORIZONTAL, -100, 100, 1);
        bSlider.setPaintTicks(true);
        bSlider.setMajorTickSpacing(50);
        bSlider.setMinorTickSpacing(25);
        bSlider.setPaintLabels(true);

        
        aLabel = new JLabel("a");
        bLabel = new JLabel("b");

        controls = new Box(BoxLayout.Y_AXIS);

        controls.add(aLabel);
        controls.add(aSlider);
        
        controls.add(bLabel);
        controls.add(bSlider);
        
        //graphPanel = new GPanel(breite, hoehe, A,B, xmin, xmax,  ymin, ymax,  a, b) ;
  
        graphPanel=new JPanel()
        {
            public Dimension getPreferredSize() 
            {
                return new Dimension(breite, hoehe);
            }

            public void paintComponent(Graphics g) 
            {
               super.paintComponent(g);

            	   // X-Achse
            	   g.drawLine(0, (int) ((ymax) * hoehe / (ymax - ymin)), breite,(int) ((ymax) * hoehe / (ymax - ymin)));
            	   // y-Achse
            	   g.drawLine((int)(-xmin*breite/(xmax-xmin)),0,(int)(-xmin*breite/(xmax-xmin)),hoehe);
             
                    for(int i=0;i<breite;i++)
             		 {
             			 double x=(xmax-xmin)*i/breite+xmin;
             			 double y=a*x+b;
             			 int v1=(int)((ymax-y)*hoehe/(ymax-ymin) );
             			 g.fillOval(i, v1, 5, 5);
             		 }//for
            }//paintComponent
        };
        
        graphPanel.setBackground(Color.white);

        add(graphPanel);
        add(controls);
        
        aSlider.addChangeListener(this);
        bSlider.addChangeListener(this);

        this.stateChanged(null);
    }//Konstruktor MyPanel

        @Override
        public void stateChanged(ChangeEvent event) 
        {
            a = aSlider.getValue();
            b = bSlider.getValue();
            aLabel.setText("a: " + a);
            bLabel.setText("b: " + b);
            graphPanel.repaint();
            // oder:
            //repaint();
        }
}//class MyPanel


/////////////////////// GPanel.java
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GPanel extends JPanel
{
	int breite;
    int hoehe ;
    int A;
    int B;
    double xmin;
    double xmax;
    double ymin;
    double ymax;
    double a, b;
    
    
    GPanel(int breite, int hoehe, int A, int B, double xmin, double xmax, double ymin, double ymax, double a, double b)
    {
    	this.breite=breite;
    	this.hoehe=hoehe;
    	this.A=A;
    	this.B=B;
    	this.xmin=xmin;
    	this.xmax=xmax;
    	this.ymin=ymin;
    	this.ymax=ymax;
    	this.a=a;
    	this.b=b;
    }
    
    @Override
    public Dimension getPreferredSize() 
    {
        return new Dimension(breite, hoehe);
    }

    @Override
    public void paintComponent(Graphics g) 
    {
       super.paintComponent(g);

    	   // X-Achse
    	   g.drawLine(0, (int) ((ymax) * hoehe / (ymax - ymin)), breite,(int) ((ymax) * hoehe / (ymax - ymin)));
    	   // y-Achse
    	   g.drawLine((int)(-xmin*breite/(xmax-xmin)),0,(int)(-xmin*breite/(xmax-xmin)),hoehe);
     
            for(int i=0;i<breite;i++)
     		 {
     			 double x=(xmax-xmin)*i/breite+xmin;
     			 double y=a*x+b;
     			 int v1=(int)((ymax-y)*hoehe/(ymax-ymin) );
     			 g.fillOval(i, v1, 5, 5);
     		 }//for
    }//paintComponent
	
}// class GPanel
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
In der stateChanged-Methode setzt du einfach nur den Text von zwei JLabels. Die inneren panels sind weder als ChangeListener auf den JSlidern registiert, noch greifen sie auf die JSlider oder die JLabels zu.
Von daher verstehe ich den Sinn der Frage "Warum wird das innere panel von den ChangeEvents nicht erreicht?" nicht. Auf welchem Wege sollten denn deiner Meinung nach die Events dort ankommen?
 

X5-599

Top Contributor
stateChanged verändert die werte der variablen a und b von MyPanel. Von diesen Änderungen bekommt die Klasse GPanel aber nichts mit, da nur einmal ein GPanel Objekt mit ihnen erzeugt wird. Das ist so, weil es sich zum einen um einen primitiven Datentyp handelt (int) und zum anderen weil Java auch bei Referenzen kein direktes Call by Reference kennt. Man könnte sich behelfen indem man eine Wrapper Klasse schreibt, die einen int (oder auch gleich beide) hat und so per getter/setter zugänglich ist. Ein Objekt davon könnte die variablen a und b ersetzen. Dieses Objekt könnte dann auch an GPanel übergeben werden.
 

keinguru

Mitglied
@VfL_Freak 09:02:
Wie gesagt, das "externalisierte" GPanel ruft die paintComponent-Methode - immerhin - einmal auf, ganz abwegig kann mein Ansatz also nicht sein. Meine Frage ist halt, warum es keine ChangeEvents verarbeitet.
 
Zuletzt bearbeitet:

keinguru

Mitglied
stateChanged verändert die werte der variablen a und b von MyPanel. [..] Man könnte sich behelfen indem man eine Wrapper Klasse schreibt, die einen int (oder auch gleich beide) hat und so per getter/setter zugänglich ist.
Ok, probiere ich.

Edit: Wunderbar, hat geklappt!! Da wäre ich nie drauf gekommen, vielen Dank!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M JPanel ausserhalb von paintComponent zeichnen AWT, Swing, JavaFX & SWT 6
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben