JFrame öffnet sich mehrmals

dat_vin

Mitglied
Huhu,

folgendes Problem:

Ich habe ein PopupMenu, welches dementsprechend diverse JFrames öffnet. Jetzt habe ich bereits ein JFrame über das Menü geöffnet und möchte ein anderes öffnen, leider öffnet sich dann das nächste 2x. Möchte ich wieder ein weiteres öffnen, öffnet sich dieses 3x etc...

Hier der Code:
Java:
JPopupMenu helpPopupMenu = new JPopupMenu();
    JMenuItem regMenuItem = new JMenuItem("Registrieren");
    JMenuItem passMenuItem = new JMenuItem("Passwort vergessen");
    JMenuItem adminMenuItem = new JMenuItem("Admin kontaktieren");

   private void jButtonLoginHelpActionPerformed(java.awt.event.ActionEvent evt) {                                                 

        helpPopupMenu.add(regMenuItem);
        helpPopupMenu.add(passMenuItem);
        helpPopupMenu.add(adminMenuItem);
        

        String mailAdmin = "example@admin.com";

        jButtonLoginHelp.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent eMouse) {
                helpPopupMenu.show(eMouse.getComponent(), eMouse.getX(), eMouse.getY());
            }
        });
        
        regMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent eReg) {
                Register reg = new Register();
                reg.setLocationRelativeTo(getParent());
                if (!reg.isVisible()) {
                    reg.setVisible(true);
                }
                
            }
        });
        passMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ePass) {
                PasswordRecover pass = new PasswordRecover();
                pass.setLocationRelativeTo(null);
                pass.setVisible(true);
            }
        });
        adminMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent eAdmin) {
                try {
                    Desktop.getDesktop().mail(new URI("mailto:" + mailAdmin));
                } catch (Exception err) {
                    err.printStackTrace();
                }
            }
        });
    }

Die entsprechenden Fenster werden über Dispose geschlossen.

Wie bekomme ich jetzt diesen Bug behoben?^^
 
erstmal geh davon weg JFrames zu öffnen.

Leite deine Klassen von JDialog ab, erstelle für jedes spezielle Fenster einen eigenen Dialog

Du kannst auch jeden Dialog schon beim initialisieren erstellen und einfach nur sichtbar machen wenn du es benötigst.
 
Zuletzt bearbeitet:
Von wo wird den diese Methode aufgerufen?
Mein Tipp wäre, dass du von dem ActionListener der das Fenster öffnet bei jedem mal eine weitere Instanz dem Button hinzufügst, sodass er dann 2x, 3x,... aufgerufen wird.
 
Probier das hier mal aus dann siehts du grob was ich meine.

Das hier dient lediglich der illustration, und würde als finale version keinesfalls taugen....

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;


@SuppressWarnings("serial")
public class Foo extends JDialog{

	private JFrame parent;
	
	public Foo(JFrame parent){
		setTitle("Dialog");
		setSize(250,250);
		setLocationRelativeTo(parent);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		this.parent = parent;
	}
	
	public static void main(String[] args){
		JFrame f = new JFrame("Mein Frame");
		f.setSize(500,500);
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		Foo dialog = new Foo(f);
		
		JMenuBar bar = new JMenuBar();
		JMenu menu = new JMenu("Dialog");
		JMenuItem item = new JMenuItem("Open dialog...");
		item.addActionListener(new ActionListener(){
			
			@Override
			public void actionPerformed(ActionEvent e){
				dialog.setVisible(true);
			}
		});
		
		menu.add(item);
		bar.add(menu);
		
		f.setJMenuBar(bar);
		
		f.setVisible(true);
	}
}
 
Zuletzt bearbeitet:
Das mit dem Dialog hört sich gut an.

, und würde als finale version keinesfalls taugen....
warum?^^

Mein Tipp wäre, dass du von dem ActionListener der das Fenster öffnet bei jedem mal eine weitere Instanz dem Button hinzufügst, sodass er dann 2x, 3x,... aufgerufen wird.
bissel kontraproduktiv oder?


Hab mal den kompletten Code zur Verdeutlichung hochgeladen. Leider arbeite ich von Anfang an mit Netbeans und ich wüsste nicht wie ich Buttons etc per Hand setzen kann bzw. so positionieren kann wie ich es will.

Die Verwendung des Frames kommt mir gelegener.

Java:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package meins;

import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URI;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

/**
 *
 * @author vin138
 */
public class Login extends javax.swing.JFrame {

    JPopupMenu helpPopupMenu = new JPopupMenu();
    JMenuItem regMenuItem = new JMenuItem("Registrieren");
    JMenuItem passMenuItem = new JMenuItem("Passwort vergessen");
    JMenuItem adminMenuItem = new JMenuItem("Admin kontaktieren");

    public Login() {
        initComponents();
        setLocationRelativeTo(null);
    }

    /**
     * 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.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPopupMenu1 = new javax.swing.JPopupMenu();
        jLabelLoginUser = new javax.swing.JLabel();
        jTextFieldLoginUser = new javax.swing.JTextField();
        jLabelLoginPassword = new javax.swing.JLabel();
        jPasswordFieldLoginPassword = new javax.swing.JPasswordField();
        jButtonLoginLogin = new javax.swing.JButton();
        jButtonLoginHelp = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Login");
        setBackground(new java.awt.Color(255, 255, 255));
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        setName("frameLogin"); // NOI18N
        setResizable(false);

        jLabelLoginUser.setText("Benutzername");

        jLabelLoginPassword.setText("Passwort");

        jButtonLoginLogin.setText("Anmelden");
        jButtonLoginLogin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonLoginLoginActionPerformed(evt);
            }
        });

        jButtonLoginHelp.setText("Hilfe");
        jButtonLoginHelp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonLoginHelpActionPerformed(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()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextFieldLoginUser, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelLoginUser))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPasswordFieldLoginPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelLoginPassword))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jButtonLoginLogin, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonLoginHelp, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButtonLoginHelp)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabelLoginUser)
                        .addComponent(jLabelLoginPassword)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldLoginUser, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jPasswordFieldLoginPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonLoginLogin))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        setBounds(0, 0, 368, 104);
    }// </editor-fold>                        


    private void jButtonLoginHelpActionPerformed(java.awt.event.ActionEvent evt) {                                                 

        helpPopupMenu.add(regMenuItem);
        helpPopupMenu.add(passMenuItem);
        helpPopupMenu.add(adminMenuItem);
        

        String mailAdmin = "example@admin.com";

        jButtonLoginHelp.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent eMouse) {
                helpPopupMenu.show(eMouse.getComponent(), eMouse.getX(), eMouse.getY());
            }
        });
        
        regMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent eReg) {
                Register reg = new Register();
                reg.setLocationRelativeTo(getParent());
                if (!reg.isVisible()) {
                    reg.setVisible(true);
                }
                
            }
        });
        passMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ePass) {
                PasswordRecover pass = new PasswordRecover();
                pass.setLocationRelativeTo(null);
                pass.setVisible(true);
            }
        });
        adminMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent eAdmin) {
                try {
                    Desktop.getDesktop().mail(new URI("mailto:" + mailAdmin));
                } catch (Exception err) {
                    err.printStackTrace();
                }
            }
        });
    }                                                

    private void jButtonLoginLoginActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    }                                                 

    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 [url=http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html]How to Set the Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)[/url] 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Login.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Login.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 Login().setVisible(true);
            }
        });

    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButtonLoginHelp;
    private javax.swing.JButton jButtonLoginLogin;
    private javax.swing.JLabel jLabelLoginPassword;
    private javax.swing.JLabel jLabelLoginUser;
    private javax.swing.JPasswordField jPasswordFieldLoginPassword;
    private javax.swing.JPopupMenu jPopupMenu1;
    private javax.swing.JTextField jTextFieldLoginUser;
    // End of variables declaration                   
}

Der Register Frame enthält halt schon sehr viele Sachen.
 
Genau das was ich gedacht habe. In initComponents fügst du dem Button einen ActionListener hinzu, der die Methode jButtonLoginHelpActionPerformed aufruft. Und in dieser Methode fügst du, bei jedem Aufruf dem Button einen ActionListener hinzu, der ein Fenster öffnet. Schreib den Code zum Fenster/Dialog öffnen einfach direkt in jButtonLoginHelpActionPerformed

EDIT: Was ist den mit den Inline-Code tags
Code:
 passiert?
 
Zuletzt bearbeitet:

Zurück
Oben