Swing Probmel mit JDialog (Modal/FocusLost/Button)

JensArpe

Mitglied
Hey,

ich habe folgendes Problem. Ich habe mir selber einen DateChooser geschrieben. Der soll wie folgt funktionieren:

1. Aus dem Hauptfenster wird auf einen Button geklickt der DateChooser-Dialog startet und bekommt einen GregorianCalendar mit. Das Hauptfenster wartet nun so lange bis der "Datum übernehmen" Button gedrückt wurde. Dann verarbeitet das Haptfenster das Datum welches der DateChooser ausgefüllt hat weiter.

Bei mir realisiert durch:

Java:
this.setModal(true);

2. Wenn der "Datum übernehmen" Button gedrückt wurde und noch kein Tag ausgewählt wurde, erscheint eine MessageBox die einen daraufhinweist und man soll den Tag auswählen können.

Bei mir realisiert durch:

Java:
if (tag != 0) {
       ......
} else {
       JOptionPane.showMessageDialog(this, "Es muss ein Tag ausgewählt werden", "Fehler",   JOptionPane.OK_OPTION);
}

3. Wenn der DateChooser-Dialog offen ist, und man klickt neben den DateChooser-Dialog soll er zugehen.

Bei mir realisiert durch:

Java:
private void formWindowLostFocus(java.awt.event.WindowEvent evt) {
        this.dispose();
}


Funktioniert auch alles super. Aber halt nur einzeln. Nicht zusammen. Das hat zur Folge, daß:

1. Wenn ich den Dialog modal mache, dann funktioniert der WindowLostFocusListener nicht mehr und wenn ich auf den "Datum übernehmen" Button drücke, und es wurde noch kein Tag ausgewählt, dann kommt die MessageBox zwar für ne Sekunde, aber der Dialog beendet sich dann gleich.

2. Wenn der Dialog nicht modal ist, dann wartet das Hauptfenster nicht mehr auf meine Eingabe und "läuft direkt über den Dialog"

3. Wenn ich in formWindowLostFocus dispose mache und wenn ich auf den "Datum übernehmen" Button drücke, und es wurde noch kein Tag ausgewählt, dann kommt die MessageBox zwar für ne Sekunde, aber der Dialog beendet sich dann gleich.


Hoffe man verstehts einigermaßen..


Hier noch der Code vom Chooser..

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.border.EtchedBorder;

public class Dialog_DateChooser extends javax.swing.JDialog {

    private int monat = 0;
    private int jahr = 0;
    private int tag = 0;
    private int stunden = 0;
    private int minuten = 0;
    private ArrayList<JLabel> panels = new ArrayList<JLabel>();
    private String[] monatsNamen = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
    private JLabel markiertesPanel = null;
    private int[] m = {11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};	//Variable für Gaußsche_Wochentagsformel
    private GregorianCalendar cal;

    /** Creates new form Dialog_DateChooser */
    public Dialog_DateChooser(Point p, GregorianCalendar c) {
        initComponents();
//        this.setModal(true);
        this.setLocation(p);
        this.setResizable(false);
        monat = Calendar.getInstance().get(Calendar.MONTH) + 1;
        jahr = Calendar.getInstance().get(Calendar.YEAR);
        stunden = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
        minuten = Calendar.getInstance().get(Calendar.MINUTE);
        js_Stunden.setValue(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));
        js_Minuten.setValue(Calendar.getInstance().get(Calendar.MINUTE));
        setMonat(monat);
        setJahr(jahr);
        for (int i = 0; i < 42; i++) {
            JLabel l = new JLabel();
            l.addMouseListener(new MouseAdapter() {

                @Override
                public void mouseClicked(MouseEvent me) {
                    JLabel temp = (JLabel) (me.getSource());
                    if (temp.isEnabled() == true) {
                        demarkieren();
                        temp.setBorder(BorderFactory.createEtchedBorder(Color.RED, null));
                        markiertesPanel = temp;
                        tag = Integer.valueOf(temp.getText());
                    }
                }
            });
            l.setHorizontalAlignment(JLabel.CENTER);
            l.setPreferredSize(new Dimension(19, 17));
            l.setMaximumSize(new Dimension(19, 17));
            l.setMaximumSize(new Dimension(19, 17));
            jp_Tage.add(l);
            panels.add(l);
            l.setBorder(new EtchedBorder());
        }
        setTage();
        cal = c;
        cal.set(jahr, monat, Calendar.getInstance().get(Calendar.DATE), stunden, minuten);
    }

    public void setJahr(int j) {
        this.jahr = j;
        jl_Year.setText(String.valueOf(jahr));
    }

    public void demarkieren() {
        if (markiertesPanel != null) {
            markiertesPanel.setBorder(BorderFactory.createEtchedBorder());
        }
        markiertesPanel = null;
        tag = 0;
    }

    public void setMonat(int m) {
        this.monat = m;
        if (m == 0) {
            jl_Month.setText(monatsNamen[11]);
            monat = 12;
        } else if (m == 13) {
            jl_Month.setText(monatsNamen[0]);
            monat = 1;
        } else {
            jl_Month.setText(monatsNamen[m - 1]);
        }
    }

    /*
     * Der erste Tag im Monat wird mit Hilfe der
     * Gaußsche_Wochentagsformel ([url=http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Wochentagsformel]Gaußsche Wochentagsformel ? Wikipedia[/url])
     * berechnet. Alle anderen Tage werden dementsprechend gesetzt.
     */

    public void setTage() {
        for (int i = 0; i < panels.size(); i++) {
            panels.get(i).setText("");
            panels.get(i).setEnabled(true);
        }
        int y = Integer.valueOf(String.valueOf(jahr).substring(2));
        int c = Integer.valueOf(String.valueOf(jahr).substring(0, 2));
        int w = 0;
        if (monat == 1 || monat == 2) {
            y--;
        }
        if (jahr == 2000 && (monat == 1 || monat == 2)) {
            c--;
        }
        w = (int) (1 + Math.floor(2.6 * m[monat - 1] - 0.2) + y + Math.floor(y / 4) + Math.floor(c / 4) - (2 * c));
        while (w < 0) {
            w += 7;
        }
        w = w % 7;  // Endgültig berechneter Tag aus der Gaußsche_Wochentagsformel.
        int i;
        if (w == 0) {
            i = 6;
        } else {
            i = w - 1;
        }
        for (int v = 1; v < getTageImMonat(monat, jahr) + 1; v++) {
            panels.get(i).setText(String.valueOf(v));
            i++;
        }
        for (int x = 0; x < panels.size(); x++) {
            if (panels.get(x).getText().equals("")) {
                panels.get(x).setEnabled(false);
            }
        }
    }

    public static int getTageImMonat(int monat, int jahr) {
        Calendar cal = Calendar.getInstance();
        Date d = new Date();
        d.setMonth(monat - 1);
        d.setYear(jahr);
        cal.setTime(d);
        return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

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

        jPanel3 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jp_Tage = new javax.swing.JPanel();
        jp_MonatJahr = new javax.swing.JPanel();
        jl_MonthPlus = new javax.swing.JLabel();
        jl_Month = new javax.swing.JLabel();
        jl_MonthMinus = new javax.swing.JLabel();
        jl_YearMinus = new javax.swing.JLabel();
        jl_Year = new javax.swing.JLabel();
        jl_YearPlus = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        js_Stunden = new javax.swing.JSpinner();
        js_Minuten = new javax.swing.JSpinner();
        jLabel9 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jLabel10 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Datum & Uhrzeit");
        setUndecorated(true);
        addWindowFocusListener(new java.awt.event.WindowFocusListener() {
            public void windowGainedFocus(java.awt.event.WindowEvent evt) {
            }
            public void windowLostFocus(java.awt.event.WindowEvent evt) {
                formWindowLostFocus(evt);
            }
        });

        jPanel3.setBackground(javax.swing.UIManager.getDefaults().getColor("ComboBox.buttonShadow"));
        jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jPanel1.setBorder(null);

        jp_Tage.setBackground(new java.awt.Color(255, 255, 255));
        jp_Tage.setBorder(null);
        jp_Tage.setLayout(new java.awt.GridLayout(6, 7));

        jp_MonatJahr.setBackground(new java.awt.Color(237, 236, 35));
        jp_MonatJahr.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        jl_MonthPlus.setText(">");
        jl_MonthPlus.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jl_MonthPlusMouseClicked(evt);
            }
        });

        jl_Month.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jl_Month.setText("September");
        jl_Month.setToolTipText("Monat");
        jl_Month.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jl_Month.setMaximumSize(new java.awt.Dimension(50, 17));
        jl_Month.setMinimumSize(new java.awt.Dimension(50, 17));
        jl_Month.setPreferredSize(new java.awt.Dimension(50, 17));

        jl_MonthMinus.setText("<");
        jl_MonthMinus.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jl_MonthMinusMouseClicked(evt);
            }
        });

        jl_YearMinus.setText("<");
        jl_YearMinus.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jl_YearMinusMouseClicked(evt);
            }
        });

        jl_Year.setText("2010");

        jl_YearPlus.setText(">");
        jl_YearPlus.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jl_YearPlusMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout jp_MonatJahrLayout = new javax.swing.GroupLayout(jp_MonatJahr);
        jp_MonatJahr.setLayout(jp_MonatJahrLayout);
        jp_MonatJahrLayout.setHorizontalGroup(
            jp_MonatJahrLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jp_MonatJahrLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jl_MonthMinus)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jl_Month, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jl_MonthPlus)
                .addGap(20, 20, 20)
                .addComponent(jl_YearMinus)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jl_Year)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jl_YearPlus)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jp_MonatJahrLayout.setVerticalGroup(
            jp_MonatJahrLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jp_MonatJahrLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jl_MonthMinus)
                .addComponent(jl_Month, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jl_MonthPlus)
                .addComponent(jl_YearMinus)
                .addComponent(jl_Year)
                .addComponent(jl_YearPlus))
        );

        jPanel2.setLayout(new java.awt.GridLayout(1, 7));

        jLabel1.setBackground(new java.awt.Color(111, 152, 203));
        jLabel1.setForeground(new java.awt.Color(255, 255, 255));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Mo");
        jLabel1.setOpaque(true);
        jPanel2.add(jLabel1);

        jLabel2.setBackground(new java.awt.Color(111, 152, 203));
        jLabel2.setForeground(new java.awt.Color(255, 255, 255));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Di");
        jLabel2.setOpaque(true);
        jPanel2.add(jLabel2);

        jLabel3.setBackground(new java.awt.Color(111, 152, 203));
        jLabel3.setForeground(new java.awt.Color(255, 255, 255));
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("Mi");
        jLabel3.setOpaque(true);
        jPanel2.add(jLabel3);

        jLabel4.setBackground(new java.awt.Color(111, 152, 203));
        jLabel4.setForeground(new java.awt.Color(255, 255, 255));
        jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel4.setText("Do");
        jLabel4.setOpaque(true);
        jPanel2.add(jLabel4);

        jLabel5.setBackground(new java.awt.Color(111, 152, 203));
        jLabel5.setForeground(new java.awt.Color(255, 255, 255));
        jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel5.setText("Fr");
        jLabel5.setOpaque(true);
        jPanel2.add(jLabel5);

        jLabel6.setBackground(new java.awt.Color(111, 152, 203));
        jLabel6.setForeground(new java.awt.Color(255, 255, 255));
        jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel6.setText("Sa");
        jLabel6.setOpaque(true);
        jPanel2.add(jLabel6);

        jLabel7.setBackground(new java.awt.Color(111, 152, 203));
        jLabel7.setForeground(new java.awt.Color(255, 255, 255));
        jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel7.setText("So");
        jLabel7.setOpaque(true);
        jPanel2.add(jLabel7);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
            .addComponent(jp_MonatJahr, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jp_Tage, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(jp_MonatJahr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jp_Tage, javax.swing.GroupLayout.DEFAULT_SIZE, 123, Short.MAX_VALUE))
        );

        jLabel8.setText("Uhrzeit:");

        js_Stunden.setModel(new javax.swing.SpinnerNumberModel(1, 1, 24, 1));

        js_Minuten.setModel(new javax.swing.SpinnerNumberModel(1, 1, 60, 1));

        jLabel9.setText("h");

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

        jLabel10.setText(":");

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 242, Short.MAX_VALUE)
            .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel3Layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(jButton1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(jPanel3Layout.createSequentialGroup()
                                .addComponent(jLabel8)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(js_Stunden, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(2, 2, 2)
                                .addComponent(jLabel10)
                                .addGap(10, 10, 10)
                                .addComponent(js_Minuten, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel9))))
                    .addContainerGap()))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 256, Short.MAX_VALUE)
            .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel3Layout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(js_Stunden, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel8)
                        .addComponent(jLabel9)
                        .addComponent(js_Minuten, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel10))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
        );

        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(0, 0, Short.MAX_VALUE)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

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

    private void jl_MonthMinusMouseClicked(java.awt.event.MouseEvent evt) {                                           
        setMonat(--monat);
        demarkieren();
        setTage();
    }                                          

    private void jl_MonthPlusMouseClicked(java.awt.event.MouseEvent evt) {                                          
        setMonat(++monat);
        demarkieren();
        setTage();
    }                                         

    private void jl_YearMinusMouseClicked(java.awt.event.MouseEvent evt) {                                          
        setJahr(--jahr);
        demarkieren();
        setTage();
    }                                         

    private void jl_YearPlusMouseClicked(java.awt.event.MouseEvent evt) {                                         
        setJahr(++jahr);
        demarkieren();
        setTage();
    }                                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if (tag != 0) {
            stunden = (Integer) js_Stunden.getValue();
            minuten = (Integer) js_Minuten.getValue();
            cal.set(jahr, monat, tag, stunden, minuten);
            this.setVisible(false);
            this.dispose();
        } else {
            JOptionPane.showMessageDialog(this, "Es muss ein Tag ausgewählt werden", "Fehler", JOptionPane.OK_OPTION);
        }
    }                                        

    private void formWindowLostFocus(java.awt.event.WindowEvent evt) {                                     
        this.setVisible(false);
        this.dispose();
    }                                    

    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JLabel jl_Month;
    private javax.swing.JLabel jl_MonthMinus;
    private javax.swing.JLabel jl_MonthPlus;
    private javax.swing.JLabel jl_Year;
    private javax.swing.JLabel jl_YearMinus;
    private javax.swing.JLabel jl_YearPlus;
    private javax.swing.JPanel jp_MonatJahr;
    private javax.swing.JPanel jp_Tage;
    private javax.swing.JSpinner js_Minuten;
    private javax.swing.JSpinner js_Stunden;
    // End of variables declaration
}
 

mfernau

Bekanntes Mitglied
Ich vermute mal, dass das Zusammenspiel zwischen modaler Dialog und focusLost nicht funktioniert. Außerdem würde focusLost triggern (auch nur eine Vermutung von mir), wenn Du den Dialog mit dem Hinweis dass noch kein Datum gewählt wurde öffnest. In diesem Fall würde Dein Dialog geschlossen werden und vermutlich auch dessen Kindelemente also der Dialog mit dem Hinweis. In solch einem Fall bräuchtest Du eine Logik, dass bei focusLost nur dann dispose aufgerufen wird, wenn nicht gerade ein Hinweisfenster geöffnet ist (irgend eine boolean Variable).

Dass Dein Hauptprogramm bei nicht modalen Dialogen weiter läuft ist normal.
 

KrokoDiehl

Top Contributor
Ich finde hier wird ein wenig das Verhalten von modalen Dialogen (blockiert übrige Anwendung) und Popups (verschwindet wenn man nicht danebenklickt) gemischt.
Es geht aber durchaus auch ohne die Blockade des modalen Dialogs:
Java:
// Modal:
public void onDoSomething()
{
    JDialog myModalDialog = getMyModalDialog();
    myModalDialog.setVisible(true); // blockiert
    myTextField.setText( myModalDialog.getPickedDate() );    
}

// nicht modal:
public void onDoSomeThing()
{
    final JDialog myDialog = getMyDialog();
    myDialog.addWindowListener(new WindowAdapter()
    {
        @Override
        public void windowClosed(WindowEvent event)
        {
            myTextField.setText( myDialog.getPickedDate() );
        }
    });

    myDialog.setVisible(true); // keine Blockade
}

Vielleicht kannst du auch mit einem JPopupMenu arbeiten, anstelle eines JDialog. Könnte aber auch aufwendig in der Umsetzung sein ;)

Ansonsten sehe ich auch das Problem mit dem Fokus.
 

JensArpe

Mitglied
Außerdem würde focusLost triggern (auch nur eine Vermutung von mir), wenn Du den Dialog mit dem Hinweis dass noch kein Datum gewählt wurde öffnest. In diesem Fall würde Dein Dialog geschlossen werden und vermutlich auch dessen Kindelemente also der Dialog mit dem Hinweis. In solch einem Fall bräuchtest Du eine Logik, dass bei focusLost nur dann dispose aufgerufen wird, wenn nicht gerade ein Hinweisfenster geöffnet ist (irgend eine boolean Variable).

Dass Dein Hauptprogramm bei nicht modalen Dialogen weiter läuft ist normal.

Ja da hast du recht. Danke schonmal für die Hilfe.

Und wie mach ich jetzt, daß ich nen modalen Dialog habe der auch seinen Focus verlieren kann? ???:L
 

mfernau

Bekanntes Mitglied
Und wie mach ich jetzt, daß ich nen modalen Dialog habe der auch seinen Focus verlieren kann? ???:L

Da gefällt mir der Hinweise von KrokoDiehl ganz gut. Mach ihn vielleicht nicht modal, aber häng einen WindowListener an, der Deinen Hauptprogramm beim verlassen des Dialogs aktualisiert. Dadurch läuft Dein Hauptprogramm zwar weiter - wird aber automatisch aktualisiert wenn Du Deinen Dialog schließt.

Anonyme Klassen sind was cooles ;)
 

JensArpe

Mitglied
Danke.. mit einer Mischung aus beidem klappts. :applaus:

@KrokoDiehl Ich hatte fast das selbe wie du schonmal versucht und es ging nicht (das war mein Fehler.. :D) Nur deswegen bin ich auf das modal gekommen. Hatte damals

Java:
        Dialog_DateChooser d = new Dialog_DateChooser(((JButton) evt.getSource()).getLocationOnScreen(), datum)
        {           
            public void windowClosed(WindowEvent event) {
                
            }
        };
        };
das da versucht, was aber wie wir jetzt wissen nicht geht..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
L JDialog hat manchmal keinen Inhalt AWT, Swing, JavaFX & SWT 2
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
B Eingaben im JDialog abwarten AWT, Swing, JavaFX & SWT 4
S Swing JDialog mit KeyEvent als Rückgabe AWT, Swing, JavaFX & SWT 1
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
stylegangsta JDialog bestimmte Zeilen kursiv AWT, Swing, JavaFX & SWT 20
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
T Event Handling JDialog schließen, sobald ein neuer erzeugt wird AWT, Swing, JavaFX & SWT 3
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
D Button auf geöffnetem JDialog AWT, Swing, JavaFX & SWT 5
N Definitionen JDialog AWT, Swing, JavaFX & SWT 7
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
F Swing JDialog schließen - WindowListener bekommt dispose nicht mit AWT, Swing, JavaFX & SWT 0
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
M JDialog statt JFrame AWT, Swing, JavaFX & SWT 22
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
3 JDialog über einem Vollbildfenster anzeigen AWT, Swing, JavaFX & SWT 5
M JDialog soll JFrame "blockieren" AWT, Swing, JavaFX & SWT 2
K JDialog zeigt Components nicht an AWT, Swing, JavaFX & SWT 3
S Jframe aus JDialog starten AWT, Swing, JavaFX & SWT 4
M JDialog übergibt eingaben nicht an aufrufende klasse AWT, Swing, JavaFX & SWT 15
S Assistent im JDialog AWT, Swing, JavaFX & SWT 7
H Swing JDialog cannot be resolved as a typ AWT, Swing, JavaFX & SWT 12
C Swing JDialog "flutet" den Arbeitsspeicher AWT, Swing, JavaFX & SWT 9
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
C Swing JDialog Ladebildschirm wird nicht angezeit AWT, Swing, JavaFX & SWT 5
Jagson Mit JMenu auf jDialog zurück? Wie? AWT, Swing, JavaFX & SWT 8
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
Jagson Swing Von JDialog zu anderem JDialog wechseln AWT, Swing, JavaFX & SWT 2
S JDialog direkt über dem MainFrame aufpoppen lassen AWT, Swing, JavaFX & SWT 2
A Swing JDialog KeyBindings und Textfelder AWT, Swing, JavaFX & SWT 5
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
D JDialog: immer nur einer gleichzeitig AWT, Swing, JavaFX & SWT 4
S JDialog per Button schließen AWT, Swing, JavaFX & SWT 2
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
D JDialog alwaysOnTop, aber nur innerhalb der Applikation AWT, Swing, JavaFX & SWT 3
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
S JDialog über Applet AWT, Swing, JavaFX & SWT 3
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
J Swing JDialog gleichzeitig mit JFrame anzeigen AWT, Swing, JavaFX & SWT 8
S Probleme jDialog einfügen AWT, Swing, JavaFX & SWT 4
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
S Schrift ändern in JDialog AWT, Swing, JavaFX & SWT 3
S Problem mit JDialog AWT, Swing, JavaFX & SWT 3
D Elternfenster vom JDialog aktualisieren oder nicht ? AWT, Swing, JavaFX & SWT 7
hdi Swing Genaue Funktionsweise von modalem JDialog? AWT, Swing, JavaFX & SWT 11
U JDialog ohne Taskleiste AWT, Swing, JavaFX & SWT 7
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
X JEditorPane Größe in JDialog automatisch anpassen AWT, Swing, JavaFX & SWT 2
Ollek JDialog Koponenten neu anordnen AWT, Swing, JavaFX & SWT 3
A JDialog AWT, Swing, JavaFX & SWT 10
Dit_ SwingUtilities.invokeLater und Modaler JDialog AWT, Swing, JavaFX & SWT 11
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A JDialog ausdrucken AWT, Swing, JavaFX & SWT 7
aze JDialog mit runden ecken AWT, Swing, JavaFX & SWT 8
Dit_ JDialog nur horizontal vergrößern AWT, Swing, JavaFX & SWT 3
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
M Swing Vererbung, Probleme mit JDialog AWT, Swing, JavaFX & SWT 12
H JDialog, Modal - Klassenübergreifend => Problem AWT, Swing, JavaFX & SWT 5
S Swing Bild (Gif) in Bitte warten JDialog AWT, Swing, JavaFX & SWT 6
U JFrame minimiert nach JDialog, JOptionPane AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2
B JDialog über JFileChooser anzeigen AWT, Swing, JavaFX & SWT 6
B JDialog AWT, Swing, JavaFX & SWT 6
E Swing Fehlerhaftes Verhalten bei gleichzeitigen Verwendnen von PopUpMenu und JDialog?! AWT, Swing, JavaFX & SWT 5
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
E Daten von JDialog nach JFrame übertragen AWT, Swing, JavaFX & SWT 4
F ActionListener von JButton funktioniert mit JFrame aber nicht mit JDialog AWT, Swing, JavaFX & SWT 2
D Mehrere Comboboxen in JDialog AWT, Swing, JavaFX & SWT 2
F JDialog per Button schliessen - klappt nicht AWT, Swing, JavaFX & SWT 4
BattleMaster246 JDialog erscheint in der Taskbar AWT, Swing, JavaFX & SWT 7
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
R Swing JDialog liefert immer false, 2 JListen verknüpfen AWT, Swing, JavaFX & SWT 3
P Swing eigenen Modalen JDialog AWT, Swing, JavaFX & SWT 6
J JDialog verliert Werte AWT, Swing, JavaFX & SWT 3
N Variablen an JDialog übergeben AWT, Swing, JavaFX & SWT 2
P Swing JDialog schliesst nicht AWT, Swing, JavaFX & SWT 2
X Swing JDialog von JInternalFrames überlappen lassen AWT, Swing, JavaFX & SWT 2
O JDialog-JScrollPane-JTable Problem AWT, Swing, JavaFX & SWT 3
N Swing Frage zu modalem JDialog. AWT, Swing, JavaFX & SWT 16
A JFrame oder JDialog AWT, Swing, JavaFX & SWT 12
B Swing JDialog : Herausfinden wie dieser beendet wurde? AWT, Swing, JavaFX & SWT 2
T JDialog ohne Fenstermanager? AWT, Swing, JavaFX & SWT 2
S JDialog in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 3
A Swing JFrame Werte aus JDialog übergeben AWT, Swing, JavaFX & SWT 4
K Swing JDialog ohne Titlebar mit Rahmen AWT, Swing, JavaFX & SWT 5
KrokoDiehl Swing KeyEvents für JDialog / JFrame AWT, Swing, JavaFX & SWT 2
C Swing JComboBox in JDialog AWT, Swing, JavaFX & SWT 3
F Frage zu Dialogen mit JDialog -Erstellung des Konstruktors AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben