JDialog, Modal - Klassenübergreifend => Problem

Hintertür

Mitglied
Nabend,

leute ich sitze vor dem folgendem problem:

ich habe einen frame, mit menüleiste, wo ich über Hilfe -> Info ein neuen frame öffne, welcher in einer anderen klasse liegt.

jedoch soll letzteres kein frame sein, sondern ein dialog. sprich, ich darf nichtmehr in das hauptprogramm(="main" frame) klicken können, bevor der "Info" dialog / frame geschlossen wurde.

ich weiß, das der konstruktor von JDialog so aussieht:
Java:
JDialog dialog = new JDialog(frame, titel, true/false(das modal));
um aber auf den "main" frame zugreifen zu können, müsste ich erst eine instanz ziehen da ich non-static arbeite. habe ich getan und der getter für den frame ist auch programmiert

aber i.wie will das modal nicht so richtig oO scheint so als würde es den "main" frame gar nicht geben

und nach ein paar tests wirft er ne nullpointer..... help pls
 
Hallo Hintertür,

eine kleine Demo könnte weiterhelfen:

Java:
import javax.swing.*;

public class ModalDemo {
    private final JFrame frame;
    private final JDialog dialog;

    public ModalDemo() {
        frame = new JFrame();
        dialog = new MyDialog(frame, true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        dialog.setSize(300, 200);
        dialog.setLocationRelativeTo(frame);
        dialog.setVisible(true);
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                ModalDemo newMain = new ModalDemo();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}

class MyDialog extends JDialog {

    MyDialog(final JFrame owner, final boolean modal) {
        super(owner, modal);
    }
}

Gruß,
André
 
jo danke...
kollege hat mir dazu auch noch nen tipp gegeben und es funzt, endlich...

aber i.wie leider nur das dialog^^ adden will er die sachen nichtmehr... hier mal mein code:
Java:
package grafik;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextArea;

import engine.Close;
class MyDialog extends JDialog {
	 
    MyDialog(final JFrame owner, final boolean modal) {
        super(owner, modal);
    }
}
public class Info extends JDialog implements KeyListener{
		
	Close close = new Close();
	JButton ok = new JButton("OK");
	JDialog dialog;
	private String textAreaData = "ProgrammName\n\rVersion: 1.0\n\r\n\rHier ein Allgemeiner Text bzw Beschreibung\n\r\n\rEntwickler: \n\r------------\n\r------------\n\r------------ ";
	JTextArea textArea = new JTextArea();
	
	public Info (String title,JFrame frame){
		dialog = new MyDialog(frame,true);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		int xPos = (d.width - 500)/2;
		int yPos = (d.height - 300)/ 2;
		dialog.setLocation(xPos, yPos);
		dialog.setSize(500, 300);
		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		dialog.addKeyListener(this);
		dialog.setLayout(null);
		dialog.setVisible(true);
		dialog.setResizable(false);
		
		textArea.setBounds(0, 0, 294, 272);
		textArea.setText(textAreaData);
		textArea.setEditable(false);
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		dialog.add(textArea);

		ok.setBounds(300, 240, 187, 24);
		ok.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				ok_ActionPerformed(evt);
			}
		});
		dialog.add(ok);
		repaint();
		ok.addKeyListener(this);
		textArea.addKeyListener(this);
	}
	private void ok_ActionPerformed(ActionEvent evt) {
		close.closeThisFrame(dialog);
	}
	@Override
	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		if(key ==KeyEvent.VK_ESCAPE){
			close.closeThisFrame(dialog);
		}
	}
	@Override
	public void keyReleased(KeyEvent arg0) {
		
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		
	}
}

mit adden meine ich, der dialog funktioniert an sich sehr gut, aber ich seh halt die objekte nichmehr :/
 
- die Klasse "MyDialog" ist überflüssig
- die Variable "JDialog dialog;" ist ebenfalls überflüssig
- "dialog = new MyDialog(frame,true);" kannst du durch "super(frame, true);" ersetzen
- "dialog" kannst du durch "this" ersetzen
- this.setVisible(true) kommt erst zum Schluss vom Konstruktor !
- vom Nulllayout wird generell abgeraten
- eine JTextArea kommt üblicherweise in ein JScrollPane

Gruß,
André
 
jedoch soll letzteres kein frame sein, sondern ein dialog. sprich, ich darf nichtmehr in das hauptprogramm(="main" frame) klicken können, bevor der "Info" dialog / frame geschlossen wurde.
Muss das so sein? Ich ärgere mich jedes mal, wenn ich von einer Software einen modalen Info-Dialog vorgesetzt bekomme. Ein nichtmodaler Dialog mit Owner-Frame sollte reichen.
 

Neue Themen


Zurück
Oben