ComponentListener / componentMoved Frust!

Flex IV

Mitglied
Hallo allerseits,
ich muss hier nochmal voranstellen dass ich eigtl. aus der Delphi-ecke komme und versuche mich jetzt in Java einzuarbeiten:
Also, da hab ich ein JPanel, und ich möchte reagieren wenn sich die Grösse verändert:

private JPanel getJSelPanel() {
if (jSelPanel == null) {
jSelPanel = new JPanel();
jSelPanel.setPreferredSize(new Dimension( 128, 24 ) );
}
return jSelBotPanel;
}

Bisher ( Delphi ) habe ich einfach das "on Resize" Ereignis des Panels angeklickt, es wurde eine entsprechende Methode generiert,
zack - fertig.

Für Java habe ich folgendes gefunden: http://java.sun.com/docs/books/tutorial/uiswing/events/componentlistener.html
Verstehe ich das richtig? ich muss:

1.: das JPanel beim "ComponenLlistener" registrieren:
private JPanel getJSelPanel() {
if (jSelPanel == null) {
jSelPanel = new JPanel();
jSelPanel.setPreferredSize(new Dimension( 128, 24 ) );
jSelPanel.addComponentListener (this);
}
return jSelBotPanel;
}

2.: die Definition der Hauptklasse anpassen:
public class SwingVEapp2
extends JPanel
implements ComponentListener, ItemListener
{


und habe dann 3.: eine Methode zum reagieren:
@Override
public void componentResized(ComponentEvent arg0) {
........
}

die genialerweise beim ,resize' aller andern komponenten ebenfalls aufgerufen wird!

Bitte bitte, sagt mir dass es da noch eine andere möglichkeit gibt das resize-Ereignis zu behandeln,
ohne die Fummelei an der Hauptklasse, und dezidiert nur für ein spezielles jPanel...

Thx.
 
Hi,
sofern ich deinem, leider unvollständigen Code, und deine Erklärungen richtig verstehe, fügst du dein Panel einem ComponentListener hinzu. Dieser ComponentListener ist deine Hauptklasse,SwingVEapp2 , ebenfalls ein JPanel. Folglich muss dieses Panel auch die ComponentListener Methoden implementieren.
Dass passt aber nicht mit dem zusammen, was du da gepostet hast. Denn du bezeichnest die Methode componentResized als @override. Und ein JPanel besitzt erstmal keine solche Methode, die man überschreiben könnte.
Kurz gesagt, dass was du machen willst, ist völlig in Ordnung, nur wo der Fehler liegt, kann man anhand der Codeschnippsel nicht sagen.

Hier mal zwei kleine Beispiele wie mans machen kann, vielleicht hilft das weiter. Was dir aber sicherlich helfen würde, wäre wenn du dich noch ein wenig intensiver mit Event-Handling in Java auseinandersetzen würdest...
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * TestPanel.java
 *
 * Created on 30.03.2010, 23:09:35
 */

package javaapplication3;

import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;

/**
 *
 * @author jw
 */
public class TestPanel extends javax.swing.JPanel implements ComponentListener{

    /** Creates new form TestPanel */
    public TestPanel() {
        initComponents();
        contentPanel.addComponentListener(this);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jButton2 = new javax.swing.JButton();
        contentPanel = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        setLayout(new java.awt.BorderLayout());

        jPanel1.setName("otherPanel"); // NOI18N

        jButton2.setText("jButton2");
        jButton2.setName("btn2"); // NOI18N

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(156, 156, 156)
                .addComponent(jButton2)
                .addContainerGap(202, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(111, 111, 111)
                .addComponent(jButton2)
                .addContainerGap(166, Short.MAX_VALUE))
        );

        add(jPanel1, java.awt.BorderLayout.CENTER);

        contentPanel.setName("resizingPanel"); // NOI18N
        contentPanel.setLayout(new javax.swing.BoxLayout(contentPanel, javax.swing.BoxLayout.LINE_AXIS));

        jButton1.setText("jButton1");
        jButton1.setName("btn1"); // NOI18N
        contentPanel.add(jButton1);

        add(contentPanel, java.awt.BorderLayout.WEST);
    }// </editor-fold>

    public void componentResized(ComponentEvent ce) {
        System.out.println("Test"+ ce.getComponent().getName());

    }

    public void componentMoved(ComponentEvent ce) {
        
    }

    public void componentShown(ComponentEvent ce) {
        
    }

    public void componentHidden(ComponentEvent ce) {
        
    }

 


    // Variables declaration - do not modify
    private javax.swing.JPanel contentPanel;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration

    public static void main(String[] args){
        JFrame j = new JFrame();
        j.getContentPane().add(new TestPanel());
        j.setSize(500,500);
        j.setVisible(true);
    }

}

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * TestPanel.java
 *
 * Created on 30.03.2010, 23:09:35
 */

package javaapplication3;

import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;

/**
 *
 * @author jw
 */
public class TestPanel extends javax.swing.JPanel{

    /** Creates new form TestPanel */
    public TestPanel() {
        initComponents();
        contentPanel.addComponentListener(new ComponentListener(){

            public void componentResized(ComponentEvent ce) {
                System.out.println("resized");
            }

            public void componentMoved(ComponentEvent ce) {

            }

            public void componentShown(ComponentEvent ce) {

            }

            public void componentHidden(ComponentEvent ce) {

            }

        });
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jButton2 = new javax.swing.JButton();
        contentPanel = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();

        setLayout(new java.awt.BorderLayout());

        jPanel1.setName("otherPanel"); // NOI18N

        jButton2.setText("jButton2");
        jButton2.setName("btn2"); // NOI18N

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(156, 156, 156)
                .addComponent(jButton2)
                .addContainerGap(202, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(111, 111, 111)
                .addComponent(jButton2)
                .addContainerGap(166, Short.MAX_VALUE))
        );

        add(jPanel1, java.awt.BorderLayout.CENTER);

        contentPanel.setName("resizingPanel"); // NOI18N
        contentPanel.setLayout(new javax.swing.BoxLayout(contentPanel, javax.swing.BoxLayout.LINE_AXIS));

        jButton1.setText("jButton1");
        jButton1.setName("btn1"); // NOI18N
        contentPanel.add(jButton1);

        add(contentPanel, java.awt.BorderLayout.WEST);
    }// </editor-fold>

   
   


    // Variables declaration - do not modify
    private javax.swing.JPanel contentPanel;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration

    public static void main(String[] args){
        JFrame j = new JFrame();
        j.getContentPane().add(new TestPanel());
        j.setSize(500,500);
        j.setVisible(true);
    }

}

Grüße!

Achja...
Bisher ( Delphi ) habe ich einfach das "on Resize" Ereignis des Panels angeklickt, es wurde eine entsprechende Methode generiert,
zack - fertig.

Das leistet aber nicht Delphi, sondern die IDE (wahrscheinlich Borland/Embarcadero?), die du nutzt. Und das kann man mit den Java IDEs auch machen....
 
Vielen Dank Artorius,
ich habe genau nach einer Lösung wie in deinem 2. Beispiel (Zeilen 29-41) gesucht - perfekt!
Die Ereignisbehandlung hat man genau da wo das Panel auch erzeugt wird.
Ich hatte ja daraufhingewiesen: ,mein' Lösungsansatz war ja der wie ich ihn auf den tutorial-seiten
von sun gefunden habe, und ich fand das halt total unpratikabel.
Mit Delphi meine ich übrig. Delphi 5 Standard (von Borland). ist zwar schon 10 Jahre alt,
aber solche Sachen gingen da einfach viel fixer von der hand...
Was dir aber sicherlich helfen würde, wäre wenn du dich noch ein wenig intensiver mit Event-Handling in Java auseinandersetzen würdest...
Na, genau das VERSUCHE ich ja grade.

Nochmal dank+gruss vom
Flex
 
Mit Delphi meine ich übrig. Delphi 5 Standard (von Borland). ist zwar schon 10 Jahre alt,
aber solche Sachen gingen da einfach viel fixer von der hand...

Nein, geht es nicht... Du kennst dich damit nur besser aus, das ist alles. Ich kenn mich sowohl in Java als auch in Delphi aus, und kann dir sagen, dass es in beiden Sprachen über die jeweiligen IDEs mit ein paar Klicks sehr schnell zu realiseren ist. Vorraussetzung: Man weis wie es geht und man weis, was man da tut..

Gutes Nächtle..!
 
Zurück