FExceptionFrame

Status
Nicht offen für weitere Antworten.

Developer_X

Top Contributor
Hi, bin am entwerfen einer neuen klasse, und habe ein Problem.
Erstmal der Code:
Java:
package main;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class FExceptionFrame extends JFrame
{
	boolean OK = false;
	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	
	JTextArea area;
	
	public FExceptionFrame()
	{
		setSize(d.width/2,d.height/2);
		setLocation(d.width/4,d.height/4);
		setTitle("Exception!");
		setLayout(new BorderLayout());
		
		area = new JTextArea();
		area.setFont(new Font("",1,15));
		area.setBackground(Color.black);
		area.setForeground(Color.yellow);
        area.setLineWrap(true);
        JScrollPane jsp = new JScrollPane(area);
		add(jsp,"Center");
		
		FButton ok = new FButton("OK")
		{
			@Override
			public void click(MouseEvent e)
			{
				OK = true;
			}
		};
		ok.setFont(new Font("",1,50),FButton.CHANGE_FONT_SIZE);
		add(ok,"South");
		
		setVisible(true);
	}
	
	public void setException(String s)
	{
		area.setText(s);
		repaint();
                         while(!OK)
                         {} 
                         setVisible(false);
	}
}
Jetzt das Problem:
Nachdem der Text durch die Methode setException gesetzt wird, soll eine Schleife gestartet werden die das Ganze Programm behindert.
Die bedingung der while schleife soll wie folgt lauten:
while(!OK)
Somit will ich dass man erst wenn man OK drückt, auch weitermachen kann im programm.
und nach der schleife die methode setvisible(false);
um das ganze zu beenden, also das fenster zu schließen.

Doch das funktioniert nicht, denn man kann den Text gar nciht mehr erkennen, auf der Textarea, und ein button ist auch nicht zu sehn im Frame.

Was kann ich tun?
 
S

Spacerat

Gast
JDialog statt JFrame erweitern.
Mit Sicherheit wird das Fenster ja von einem JFrame geöffnet. Diesen kann man dem JDialog als Parameter übergeben. Zusammen mit [c]modal = true[/c], macht der JDialog dann genau das was du haben möchtest und zwar ohne Schleife.
 
Zuletzt bearbeitet von einem Moderator:

hdi

Top Contributor
Hier mal eine Hilfsklasse die ich mir mal geschrieben habe. Es ist eben ein modaler Dialog, es gibt zwar im Moment keinen Button (man schließt es über das rote X oben rechts), aber das kannst du ja noch selber einbauen

edit: Ich hab ihn jetzt für dich etwas umgebaut weil man ihn nicht genauso hätte übernehmen können. Du solltest jetzt noch null-Prüfungen vornehmen für die msg und die übergebene Exception!

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

/**
 * Modal confirmation dialog showing an error.
 * 
 * @author thomas Aug 20, 2009
 * 
 */
public class ErrorDialog extends JDialog {

	private static final long serialVersionUID = 1L;
	private JLabel text;
	private JTextArea stacktrace;

	public ErrorDialog(JFrame owner, String msg, Exception e) {
		super(owner, true);

		setTitle("Fehler");
		setResizable(false);

		// create message label
		text = new JLabel();
		text.setText(msg);

		// create stack trace label
		stacktrace = new JTextArea();
		StackTraceElement[] stes = e.getStackTrace();
		String out = e.toString() + "\n";
		for (int i = 0; i < stes.length; i++) {
			out += stes[i].toString();
			if (i != stes.length - 1) {
				out += "\n";
			}
		}
		stacktrace.setText(out);
		/* stack trace does not get default font, but a smaller, italic one */
		stacktrace.setFont(new Font("Arial", Font.ITALIC, 10));

		// add components
		JPanel p = new JPanel();
		p.setLayout(new BorderLayout(5, 5));
		p.add(text, BorderLayout.NORTH);
		p.add(stacktrace, BorderLayout.CENTER);
		setLayout(new FlowLayout());
		add(p);

		// set Color
		Color bg = new Color(255, 170, 170);
		getContentPane().setBackground(bg);
		p.setBackground(bg);
		text.setOpaque(true);
		text.setBackground(bg);
		stacktrace.setOpaque(true);
		stacktrace.setBackground(bg);

		// pack and center
		pack();
		setLocationRelativeTo(owner);
		toFront();
	}
}
 
Zuletzt bearbeitet:

Developer_X

Top Contributor
Danke erstmal an alle, für eure antworten, ich habe meine klasse einfach mal bisschen aufgerüstet.
Java:
package main;

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class FExceptionFrame extends JDialog
{
	JTextArea area;
	
	public FExceptionFrame(JFrame f, String exept)
	{
		super(f, true);
		
		setTitle("Exception!");
		setLayout(new BorderLayout());
		
		area = new JTextArea();
		area.setFont(new Font("",1,15));
		area.setBackground(Color.black);
		area.setForeground(Color.yellow);
		area.setText(exept+"\n"+"Um weiterzumachen dieses Fenster schließen.");
        area.setLineWrap(true);

        JScrollPane jsp = new JScrollPane(area);
		add(jsp,"Center");
		
        FButton ok = new FButton("OK")
        {
            @Override
            public void click(MouseEvent e)
            {
                
            }
        };
        ok.setFont(new Font("",1,50),FButton.CHANGE_FONT_SIZE);
        add(ok,"South");

        pack();
        setLocationRelativeTo(f);
        toFront();
        
        setVisible(true);
	}
}

2 Neue Probleme:
Ich möchte gerne dass:
Wenn ich auf Ok drücke, auch das fenster geschlossen wird.

Und dass meine TextArea den Zeilenumbruch nur bei ganzen wörtern macht, denn sie macht es momentan mit einzelnen buchstaben.

M.f.G.
Developer_X
 
S

Spacerat

Gast
Irgendwo in dem öffnenden Fenster instanzierst du doch deinen Dialog. Genau an dieser Stelle wartet das Fenster, bis der Dialog beendet bzw. geschlossen wurde. Wenn man also direkt hinter diesem Aufruf des Dialogs [c](Frame) this.dispose()[/c] schreibt, verschwindet auch das aufrufende Fenster.
Eine andere unsauberere Möglichkeit: Innerhalb des Dialogs (also innerhalb [c]click(MouseEvent e)[/c] nehm ich an) [c]getParent().dispose();[/c] aufrufen.
 
Status
Nicht offen für weitere Antworten.

Oben