Button verschwindet nachdem ein Rechteck gezeichnet wurde

Hallo Zusammen,
das ist hier mein erstes Thema.
Ich habe mit Hilfe des GUI-Builders einen Button erstellt und den folgenden
Programmcode programmiert.
Es funktioniert auch, allerdings verschwindet der Button.
sobald ich mit der Maus die Buttonoberfläche verlasse, wird er neu gezeichnet.
Hoffentlich kann mir jemand weiterhelfen.
Gruß
essgernekuchen


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
Graphics g = getGraphics();
g.drawRect(300, 159, 100, 200);
jButton1.repaint();//freundliche Bitte
}
 
1. Code bitte immer in entsprechende Code-Tags packen. [code=Java]My Code[/code]
2. Das verhalten kann verschiedenen Ursachen haben (meist ein zu früh aufgerufenes setVisible(true) ) - an deinem geposteten Code liegt es jedenfalls nicht. Poste am Besten mal den gesamten Code..
 
Hallo Robat,
vielen Dank für die schnelle Antwort.
Ich habe den Code mit dem GUI-Builder erstellt und vereinfacht.
Nun hat sich das Verhalten geändert. Beim ersten Mausklick wird das Rechteck erzeugt
und verschwindet wieder. Beim zweiten Mausklick bleibt das Rechteck.
Über einen Ratschlag wäre ich sehr erfreut.
Java:
import java.awt.Graphics;

public class NewJFrame extends javax.swing.JFrame
{

    public NewJFrame()
    {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                        
    private void initComponents()
    {

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(66, 66, 66)
                .addComponent(jButton1)
                .addContainerGap(239, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(201, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(70, 70, 70))
        );

        pack();
    }// </editor-fold>                      

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                        
    {                                            
        Graphics g = getGraphics();
        g.drawRect(200, 100, 100, 200);
    


    }                                      

    public static void main(String args[])
    {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        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(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex)
        {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex)
        {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex)
        {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                    
    private javax.swing.JButton jButton1;
    // End of variables declaration                  
}
 
Es bringt nichts das Rechteck irgendwo zu zeichnen und danach ein rePaint() aufzurufen. Die Componenten werden vom System gezeichnet wenn das System es will. Und wenn dann dein Rechteck nicht gezeichnet wird verschwindet es eben.

Lies doch mal in die Grundlagen ein. Du Must alles was du selber zeichnen willst in paintComponent() Zeichnen und nirgendwo anders.

Es gibt dazu ohne Ende Beispiele im Netz...
 
Hallo Thallius,
vielen Dank für den Ratschlag, ich werde ihn beherzigen.

Als hardwarenaher Programmierer fällt mir der Gedanke eher schwer, die Kontrolle
an das Betriebssystem abzugeben.
Ist eine Zwischenlösung denkbar. D.h. paintComponent() malt vom System bestimmt,
aber mit setVisible entscheidet der Programmierer wenn es sichtbar wird?
Gruß
essgernekuchen
 
Naja, bei setVisible(false) wird paintComponent wahrscheinlich gar nicht aufgerufen, denn es muss ja nichts gezeichnet werden.

Du must Dir paintComponent() einfach als Callback in der eigentlich Zeichenroutine des Systems vorstellen. Während dieses sein Fenster/Panel, wo auch immer du dich "reingehängt" hast, zeichnet, fragt es Dich was du gerne zeichnen möchtes. Läßt Du den super() Aufruf darin weg kannst du die Componente sogar komplett selber zeichnen wenn Du möchtest.

Überlass dem System die Entscheidung wann was gezeichnet werden muss. Das weiß es besser als Du. Entscheide Du nur WAS gezeichnet werden soll.

Gruß

Claus
 

Zurück
Oben