Aktualisierung von JFrame funktioniert nicht

Tinipieps

Mitglied
Hallo!

Ich habe eine GUI (E-Mail-Client) selbst geschrieben.
Nun sollen während der Laufzeit die Anhänge, die ausgewählt werden, angezeigt werden.
Da das Fenster mit pack() optimal an die Größe der Komponenten angepasst wird und diese Komponenten eben erst während der Laufzeit dazu kommen, verschiebt sich alles.
Lieber wäre mir, wenn sich das Fenster aktualisiert und sich der neuen Größe anpasst.
Wie bekomme ich das hin?
Habs mit this.repaint(), p.validate() und container.validate() in der Methode durchsuchen() probiert - leider alles ergebnislos

(relevanter Code ist rot markiert)

Code:
package client;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Arrays;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import sendMail.SendMail;
import adresses.Receiver;
import adresses.Sender;
import application.Application;

/**
 * Diese Klasse erstellt das Hauptfenster
 * @author Stepanski
 *
 */
public class Client extends JFrame{

	private static final long serialVersionUID = 1L;
	
	/*Attribute*/
		
	static String nutzer = null;
	
	static Container container;
	JMenuBar menueLeiste;
	
	static JPanel p = new JPanel();
	GridBagLayout gbl = new GridBagLayout();
	
	//////////////////////////////////////////////////////////////////
	//Menuepunkte
	JMenu datei;
	JMenu hilfe;
	
	//Menueunterpunkte Datei
	JMenuItem neu;
	JMenuItem schliessen;
	
	//Menueunterpunkte Hilfe
	JMenuItem hilfethemen;
	JMenuItem ueberUns;
	
	//////////////////////////////////////////////////////////////////
	
	private JLabel user;
	private static JComboBox cb1;
	
	private JLabel empfaenger;
	private static JTextField tfempf;
	private ImageIcon iconAdr = new ImageIcon(
						Application.path+"address-book-icon_3d.png");
	private JLabel adressbuch;
	
	private JLabel cc;
	private static JTextField tfcc;
		
	private JLabel bcc;
	private static JTextField tfbcc;
	
	private JLabel betreff;
	private static JTextField tfbetreff;
    	
	private static JTextArea message; 
	
	private ImageIcon  icon = new ImageIcon(
			Application.path+"attachment-icon.png");
	private JLabel anhangIcon;
	private JLabel dateiAnhang;
	private JButton durchsuchen;
	
	static String[] inputVerzStr = new String[3];
	
	private ImageIcon  iconLoeschen = new ImageIcon(
			Application.path+"glossy-3d-blue-delete-icon.png");
	private JLabel anhangLoeschenIcon;
	private JLabel anhangLoeschenIcon2;
	private JLabel anhangLoeschenIcon3;
	
	private JButton send;
	
	private String editable = Receiver.getEditable(); 
	
	
	/*Konstruktor*/
	/**
	 * Diese Methode stellt den Konstruktor dar.
	 * Sie erzeugt eine Instanz der Klasse Client, wodurch das Hauptfenster
	 * geoeffnet wird.
	 */
	public Client(){
		super("E-Mail Client");
		this.createGUI();
		
		// entfaellt, wenn man this.pack() nutzt
		this.setSize(800,600);
      	      	
        // um GUI zentriert anzuzeigen
		this.setLocationRelativeTo(null);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setResizable(false);
        // optimale Groeße, an Komponenten angepasst
        this.pack();        
	}
	
	/*Methoden*/
	
	/*
	 * Methode für E-Mail-Client-GUI
	 */
	/**
	 * Methode erzeugt GUI, mit der E-Mail versandt wird.
	 */
	public void createGUI(){
		
		container = this.getContentPane();
		
		//////////////////////////////////////////////////////////////////
		//Menueleiste erzeugen
		menueLeiste = new JMenuBar();
			
		//Menueelemente erzeugen
		datei = new JMenu("Datei");
		hilfe = new JMenu("Hilfe");
		
		//Menueunterpunkte erzeugen
		neu = new JMenuItem("Neues Memo erstellen");
		neu.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent object) {
				// loescht Inhalte der Felder, wenn neues Memo erstellt 
				// werden soll
				if (object.getSource() == neu){
		             neuesMemo();
		        }				
			}
			
		});
		
		schliessen = new JMenuItem("Schließen");
		schliessen.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// Aktion beim Schließen des Programms
				System.exit(0);
			}
		
		});
		hilfethemen = new JMenuItem("Hilfethemen");
//		hilfethemen.addActionListener(arg0);
		ueberUns = new JMenuItem("Über E-Mail Client...");
//		ueberUns.addActionListener(arg0);
		
		//Menueelemente hinzufuegen
		menueLeiste.add(datei);
		menueLeiste.add(hilfe);
		
		//Menueunterpunkte hinzufuegen
		datei.add(neu);
		datei.add(schliessen);
		hilfe.add(hilfethemen);
		hilfe.add(ueberUns);
		
		this.setJMenuBar(menueLeiste);
		
		/////////////////////////////////////////////////////////////////
		//Eingabefeld erzeugen
		
		p.setLayout(gbl);
		GridBagConstraints constraints = new GridBagConstraints();
		// x-Position (Anfangsspaltennummer)
		constraints.gridx = 0;
		// y-Position (Anfangszeilennummer)
		constraints.gridy = 1;
		// Breite 
		constraints.gridwidth = 1;
		// Hoehe
		constraints.gridheight = 1;
		// Gewichtung festlegen (fuer Platzaufteilung)
		constraints.weightx = 1;
		constraints.weighty = 1;
		// Angabe, wie Komponente Feld fuellt
		constraints.anchor = GridBagConstraints.CENTER;		
		
		user = new JLabel("Absender: ");
		// Abstand der graphischen Komponente zum Feld 
		// (oben, links, unten, rechts)
		constraints.insets = new Insets(20,20,20,20);
		p.add(user, constraints);
		
		////////////////////////////////////////////////////////////
        // ComboBox mit Adressen aufrufen
		cb1 =new JComboBox();
		constraints.gridx=1;
		// Dimension -> ueber 2 x-Felder
		constraints.gridwidth = 2;
		p.add(cb1, constraints);
				
		fillSenderCombo();
		
		send = new JButton("versenden");
		constraints.gridx = 3;
		constraints.gridwidth = 1;
		constraints.insets = new Insets(20,20,20,20);
		gbl.setConstraints(send, constraints);
		p.add(send);
		
		// Aktion, wenn auf "versenden"-Button gedrueckt wird
		send.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// Aufruf der Methode sendMail() und loeschen aller 
				// alten Inhalte
				SendMail.sendMail();
				neuesMemo();
			}
		});
		
		// Damit "s" unterstrichen wird
		send.setMnemonic(java.awt.event.KeyEvent.VK_S);
			
		empfaenger = new JLabel("Empfänger");
		constraints.gridx = 0;
		constraints.gridy = 2;
		constraints.insets = new Insets(0,0,0,0);
		p.add(empfaenger, constraints);
		
		tfempf = new JTextField(30);
		if (editable.equals("nein"))
			tfempf.setEditable(false);
		tfempf.scrollRectToVisible(getBounds());
		constraints.gridx = 1;
		constraints.weightx = 0;
		constraints.gridwidth = 2;
		p.add(tfempf, constraints);		
		
		adressbuch  = new JLabel(iconAdr);
		constraints.gridx = 3;
		constraints.gridy = 3;
		constraints.weightx = 1;
		constraints.weighty = 1;
		constraints.gridwidth = 1;
		p.add(adressbuch, constraints);
		
		// Aktion, wenn mit Maustaste auf Adressbuch-Icon gedrueckt wird
		adressbuch.addMouseListener (new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent arg0) {
			}
			@Override
			public void mouseEntered(MouseEvent arg0) {
			}
			@Override
			public void mouseExited(MouseEvent arg0) {
			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				// Adressbuch-Auswahl wird geoeffnet
				Adressbuch.createAdressbuchAuswahl();
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
			}			
		});
		
		cc = new JLabel("Kopie");
		constraints.gridx = 0;
		constraints.weightx = 0;
		constraints.weighty = 0;
		p.add(cc, constraints);
		
		tfcc  = new JTextField(30);
		constraints.gridx = 1;
		constraints.gridwidth = 2;
		p.add(tfcc, constraints);
		if (editable.equals("nein"))
			tfcc.setEditable(false);
		tfcc.scrollRectToVisible(getBounds());
		
		bcc = new JLabel("Blindkopie");
		constraints.gridx = 0;
		constraints.gridy = 4;
		constraints.gridwidth = 1;
		p.add(bcc, constraints);
		
		setTfbcc(new JTextField(30));
		constraints.gridx = 1;
		constraints.weightx = 0;
		constraints.gridwidth = 2;
		p.add(getTfbcc(), constraints);
		if (editable.equals("nein"))
			getTfbcc().setEditable(false);
		tfbcc.scrollRectToVisible(getBounds());
	
		betreff = new JLabel("Betreff");
		constraints.gridx = 0;
		constraints.gridy = 5;
		constraints.gridwidth = 1;
		constraints.insets = new Insets(20,20,20,20);
		p.add(betreff, constraints);
		
		tfbetreff  = new JTextField(30);
		constraints.gridx = 1;
		constraints.weightx = 0;
		constraints.gridwidth = 2;
		p.add(tfbetreff, constraints);		
		
		message = new JTextArea(10,50);
		message.setLineWrap(true);
		
		// Feld fuer Nachricht wird in JScrollPane eingebette, damit
		// Groesse des Feldes bei langem Text erhalten bleibt
		JScrollPane scrollPane = new JScrollPane(message);
		GridBagConstraints scrollConstraints = new GridBagConstraints();
		scrollConstraints.gridx = 0;
		scrollConstraints.gridy = 7;
		scrollConstraints.gridwidth = 4;
		scrollConstraints.gridheight = 1;
		gbl.setConstraints(scrollPane, scrollConstraints);
		p.add(scrollPane);
		
		anhangIcon = new JLabel(icon);
		constraints.gridx = 0;
		constraints.gridy = 8;
		// Abstand der graphischen Komponente zum Feld 
		// (oben, links, unten, rechts)
		constraints.insets = new Insets(20,20,20,20);
		p.add(anhangIcon, constraints);
		
		dateiAnhang = new JLabel("Dateianhänge zur E-Mail");
		constraints.gridx = 1;
		p.add(dateiAnhang, constraints);
		
		durchsuchen = new JButton("durchsuchen...");
		constraints.gridx = 3;
		p.add(durchsuchen, constraints);
		
		// Aktion, wenn auf "durchsuchen"-Button gedrueckt wird
		// oeffnet JFileChooser, der es ermoeglicht, den Anhang auszuwaehlen
		durchsuchen.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent arg0) {
				Client.this.durchsuchen();
				//zur Kontrolle des Pfades
				for (int i=0; i<inputVerzStr.length; i++){
					String pfad = inputVerzStr[i];
					System.out.println(pfad);
				}
			}	        
		});
		
		anhangLoeschenIcon = new JLabel("Hier steht der Text des Anhangs",
												iconLoeschen,JLabel.CENTER);
		anhangLoeschenIcon.setVisible(false);
		constraints.gridx = 1;
		constraints.gridy = 9;
		constraints.gridwidth = 2;
		constraints.insets = new Insets(0,0,10,0);
		p.add(anhangLoeschenIcon, constraints);
				
		// Aktion, wenn mit Maustaste auf Adressbuch-Icon gedrueckt wird
		anhangLoeschenIcon.addMouseListener (new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent arg0) {
			}
			@Override
			public void mouseEntered(MouseEvent arg0) {
			}
			@Override
			public void mouseExited(MouseEvent arg0) {
			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				inputVerzStr[0] = null;
				anhangLoeschenIcon.setText("");
				anhangLoeschenIcon.setIcon(null);
				anhangLoeschenIcon.setVisible(false);
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
			}			
		});
		
		anhangLoeschenIcon2 = new JLabel("Hier steht der Text des Anhangs",
				iconLoeschen,JLabel.CENTER);
		anhangLoeschenIcon2.setVisible(false);
		constraints.gridx = 1;
		constraints.gridy = 10;
		constraints.gridwidth = 2;
		p.add(anhangLoeschenIcon2, constraints);

		// Aktion, wenn mit Maustaste auf Adressbuch-Icon gedrueckt wird
		anhangLoeschenIcon2.addMouseListener (new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent arg0) {
			}
			@Override
			public void mouseEntered(MouseEvent arg0) {
			}
			@Override
			public void mouseExited(MouseEvent arg0) {
			}
			
			@Override
			public void mousePressed(MouseEvent arg0) {
				inputVerzStr[1] = null;
				anhangLoeschenIcon2.setText("");
				anhangLoeschenIcon2.setIcon(null);
				anhangLoeschenIcon2.setVisible(false);
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
			}			
		});
		
		anhangLoeschenIcon3 = new JLabel("Hier steht der Text des Anhangs",
				iconLoeschen,JLabel.CENTER);
		anhangLoeschenIcon3.setVisible(false);
		constraints.gridx = 1;
		constraints.gridy = 11;
		constraints.gridwidth = 2;
		p.add(anhangLoeschenIcon3, constraints);

		// Aktion, wenn mit Maustaste auf Adressbuch-Icon gedrueckt wird
		anhangLoeschenIcon3.addMouseListener (new MouseListener(){

			@Override
			public void mouseClicked(MouseEvent arg0) {
			}
			@Override
			public void mouseEntered(MouseEvent arg0) {
			}
			@Override
			public void mouseExited(MouseEvent arg0) {
			}
			
			@Override
			public void mousePressed(MouseEvent arg0) {
				inputVerzStr[2] = null;
				anhangLoeschenIcon3.setText("");
				anhangLoeschenIcon3.setIcon(null);
				anhangLoeschenIcon3.setVisible(false);
			}

			@Override
			public void mouseReleased(MouseEvent arg0) {
			}			
		});
		
		// absenden der Nachricht ueber "Alt + s"
		p.addKeyListener(new KeyListener(){

			@Override
			public void keyPressed(KeyEvent e) {
				int key = e.getKeyCode();
				if ( key == KeyEvent.VK_ALT && key == KeyEvent.VK_S){
					SendMail.sendMail();
					neuesMemo();
				}
				
			}
			@Override
			public void keyReleased(KeyEvent arg0) {
				
			}
			@Override
			public void keyTyped(KeyEvent arg0) {
			
			}			
		});
		
		container.add(p, BorderLayout.CENTER);
	}
	
	/**
	 *  Diese Methode fuellt die JComboBox, welche im Auswahl-Dialog 
	 *  eingebettet wird
	 */
	public static void fillSenderCombo(){
		
		String [] adressen = Sender.getSender();
		Arrays.sort(adressen);
		for (String i:adressen) {
			System.out.println(i);
			cb1.addItem(i);
		}
	}
	
	/*
	 * Methode, um Anhang-Auswahl zu erstellen
	 */
	
	/**
	 * Diese Methode erzeugt einen Dialog, indem man eine Datei als 
	 * Anhang auswählen kann.
	 * @return Verzeichnis-Pfad der angehängten Datei
	 */
	public String[] durchsuchen(){
		
		JFileChooser chooser = new JFileChooser();
		//Oeffnungsdialog zuweisen
        chooser.setDialogType(JFileChooser.OPEN_DIALOG);
        //Anzeigen von Verzeichnissen und Dateien
        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        //Ausgangsverzeichnis
        final File file = new File("/home"); 
        chooser.setCurrentDirectory(file);
        
        //Um Auswahl zu aktualisieren
        chooser.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent e) {
                if (e.getPropertyName().
                		equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)
                    || e.getPropertyName().
                    	equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)) {
                	
                    @SuppressWarnings("unused")
					final File f = (File) e.getNewValue();
                    
                }
            }
        }); 
        chooser.setVisible(true);
        final int result = chooser.showOpenDialog(null);

        if (result == JFileChooser.APPROVE_OPTION) {
            
        	if (anhangLoeschenIcon.getText().equals(
        							"Hier steht der Text des Anhangs") 
        				||	anhangLoeschenIcon.getText().equals("")){
        		anhangLoeschenIcon.setIcon(iconLoeschen);
        		File inputVerzFile = chooser.getSelectedFile();
            	inputVerzStr[0] = inputVerzFile.getPath();
            	anhangLoeschenIcon.setText(inputVerzStr[0]);
            	String text_old = anhangLoeschenIcon.getText();
            	int laenge = text_old.length();
            	if (laenge >= 25){
            		anhangLoeschenIcon.setText(text_old.substring(
            				text_old.lastIndexOf('\\')+1));
            		System.out.println(anhangLoeschenIcon.getText());
            		anhangLoeschenIcon.setVisible(true);
            	}
        	}else if (anhangLoeschenIcon2.getText().equals(
									"Hier steht der Text des Anhangs") 
						||	anhangLoeschenIcon2.getText().equals("")){
        		anhangLoeschenIcon2.setIcon(iconLoeschen);
        		File inputVerzFile = chooser.getSelectedFile();
        		inputVerzStr[1] = inputVerzFile.getPath();
            	anhangLoeschenIcon2.setText(inputVerzStr[1]);
            	String text_old = anhangLoeschenIcon2.getText();
            	int laenge = text_old.length();
            	if (laenge >= 25){
            		anhangLoeschenIcon2.setText(text_old.substring(
            				text_old.lastIndexOf('\\')+1));
            		System.out.println(anhangLoeschenIcon2.getText());
            		anhangLoeschenIcon2.setVisible(true);
            	}
        	}else if (anhangLoeschenIcon3.getText().equals(
									"Hier steht der Text des Anhangs") 
						||	anhangLoeschenIcon3.getText().equals("")){
        		anhangLoeschenIcon3.setIcon(iconLoeschen);
        		File inputVerzFile = chooser.getSelectedFile();
        		inputVerzStr[2] = inputVerzFile.getPath();
            	anhangLoeschenIcon3.setText(inputVerzStr[2]);
            	String text_old = anhangLoeschenIcon3.getText();
            	int laenge = text_old.length();
            	if (laenge >= 25){
            		anhangLoeschenIcon3.setText(text_old.substring(
            				text_old.lastIndexOf('\\')+1));
            		System.out.println(anhangLoeschenIcon3.getText());
            		anhangLoeschenIcon3.setVisible(true);
            	}
        	}else
        		JOptionPane.showMessageDialog(null, 
    					"Sie können nur maximal 3 Dateien anhängen.", null, 
    						JOptionPane.PLAIN_MESSAGE);        		
        }
        
        System.out.println("FileChooser wurde geschlossen");
        chooser.setVisible(false);
        container.validate();
        
        return inputVerzStr;        
   	}	
	
	
	private void neuesMemo(){
		getTfempf().setText(null);
        tfcc.setText(null);
        tfbcc.setText(null);
        anhangLoeschenIcon.setText(null);
        tfbetreff.setText(null);
        message.setText(null);
	}
	
	/*
	 * getter/setter für Mail-Versand
	 */
	
	public static String getAbsender(){
		String absender = cb1.getSelectedItem().toString();
		return absender;
	}
	
	public static String getEmpfaenger(){
		String empfaenger = getTfempf().getText();
		return empfaenger;
	}
	
	public static String getKopie(){
		String kopie = tfcc.getText();
		return kopie;
	}
	
	public static String getBlindkopie(){
		String blindkopie = getTfbcc().getText();
		return blindkopie;
	}
	
	public static String[] getAnhang() {
		String [] anhang = inputVerzStr;
		return anhang;
	}
	
	public static String getBetreff(){
		String betreff = tfbetreff.getText();
		return betreff;
	}
	
	public static String getNachricht(){
		String nachricht = message.getText();
		return nachricht;
	}

	/**
	 * @param tfbcc the tfbcc to set
	 */
	public static void setTfbcc(JTextField tfbcc) {
		Client.tfbcc = tfbcc;
	}

	/**
	 * @return the tfbcc
	 */
	public static JTextField getTfbcc() {
		return tfbcc;
	}  
	
	/**
	 * @return the tfcc
	 */
	public static JTextField getTfcc() {
		return tfcc;
	} 

	/**
	 * @param tfempf the tfempf to set
	 */
	public static void setTfempf(JTextField tfempf) {
		Client.tfempf = tfempf;
	}

	/**
	 * @return the tfempf
	 */
	public static JTextField getTfempf() {
		return tfempf;
	}
}
 

Anhänge

  • Screenshot E-Mail-Client.JPG
    Screenshot E-Mail-Client.JPG
    23,3 KB · Aufrufe: 33
Hallo,

bin mir nicht sicher ob ich dich jetzt richtig verstanden habe.

Wenn du willst, daß sich das Fenster neu an die darin enthaltenen Elemente anpaßt, mußt du in deinem Code
Code:
this.setSize(800,600);
auskommentieren, damit sich die Fenstergröße anpassen kann.

Wenn jetzt eine neue Komponete hinzukommt, sollte es mit "this.validate()", "this.pack()" und einem anschließenden "this.repaint()" funktionieren, d. h. das Fenster paßt sich dem Inhalt an.

MfG
hansmueller
 
Das wars

Danke

Hatte die Größe nur gesetzt, damit ich
Code:
this.setLocationRelativeTo(null);
benutzen kann.
Hab es jetzt einfach durch
Code:
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		int x = ((int)dim.getWidth()-750)/2;
		int y = ((int)dim.getHeight()-600)/2;
		this.setLocation(x, y);
ersetzt und die setSize()-Methode rausgenommen
Dann hab ich in der Methode durchsuchen() einfach die von dir genannten Befehle eingefügt

Danke nochmal
 
Kann man mit pack() aber genauso verwenden.

Java:
public static void main(String[] args)
{
	JFrame frame = new JFrame();
	frame.add(new JButton("lol"));
	frame.pack();
	frame.setLocationRelativeTo(null);
	frame.setVisible(true);
}
 
Zurück