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)
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;
}
}