Daten von JDialog nach JFrame übertragen

edfred

Mitglied
Hallo zusammen,

ich habe ein kleines Problem. Habe mir selber ein klaines Projekt angelegt um etwas Java zu üben. Versuche schon die ganze Zeit die Daten in Form von Strings in den JTextFields aus einem JDialog in die JTextFields eines JFrames zu überführen.
Das JFrame ist meine Main-GUI und das JDialog wird über ein JMenuItem der Main-GUI gestartet. Beim klicken des Buttons "Übernehmen" sollen die Daten vom Dialog in die Main-GUI übernommen werden.
Klappt aber so wie ich mach nicht. Die Felder bleiben leer.

Hier der Code für die Main-GUI:

Java:
// imports und package-Angabe

// Initialisierung von Feldern, wie z.B. Textfelder, Buttons, usw...
public class AddressbookGUI extends JFrame{
    private static JTextField                   givennameField;
    private static AddressbookEntry 	entry;	
    private static ArrayList<String> 	listData = new ArrayList<String>();
	
    public AddressbookGUI() {
		AddressbookGUI.entry = new AddressbookEntry();
    }

    public void createView() {
  		
                /*
                 * Initialisiert Lables und Textfelder mit Defaultwerten, Größen, Farbe, usw..
                 */
		initLabelsAndFields();
		
                /* Die Methode füllt ein Panel mit Labels und Textfeldern der Eingabemaske.
                 * Versorgt das Panel mit einem Layout und fügt es dem JFrame hinzu.
                 */
		initContent();
	        
                /* Macht das Frame Sichtbar. Enthält noch Einstellungen wie Größe und
                 * Position des JFrames.
                 */
		initFrame();
	}

        private void initLabelsAndFields() {
               //Beispiel für die Initialisierung von einem Lablel und einem Textfeld.
               givennameLabel = new JLabel(Constants.GIVENNAME_LABEL_DE);
               givennameLabel.setSize(Constants.LABEL_SIZE);
        
               int count = 0;
               givennameField = new JTextField(
                    entry.getPerson().getGivenname() == null ? "" : entry.getPerson().getGivenname());
               givennameField.setBackground(count%2==0 ? Constants.GRAY : Constants.WHITE);
               count += 1;
              
               // usw....
        }

        private void initContent() {
		
		GridBagLayout gbl = new GridBagLayout();
		GridBagConstraints constraints = new GridBagConstraints();
		
		mainContentPanel = new JPanel();
		mainContentPanel.setLayout(gbl);
		picturePanel = new JPanel();
		
		/*
		 * If no entries available, no information should be available. 
		 * mainContentPanel can be set to not enabled.
		 */
		if(listData.size() != 0) {
			int countY = 0;
			
			int none = GridBagConstraints.NONE;
			int horizontal = GridBagConstraints.HORIZONTAL;
			
			constraints.fill = horizontal;
			constraints.gridx = 0;
			constraints.gridy = ++countY;
			constraints.anchor = GridBagConstraints.ABOVE_BASELINE_LEADING;
			constraints.weightx = 1.5;
			constraints.gridwidth = 2;
			constraints.insets = new Insets(5, 5, 5, 50);
			mainContentPanel.add(givennameLabel,constraints);
			
			constraints.fill = horizontal;
			constraints.gridx = 1;
			constraints.gridy = countY;
			constraints.insets = new Insets(5, 50, 5, 50);
			mainContentPanel.add(givennameField, constraints);
                        //usw....
                 } else mainContentPanel.setEnabled(false);
		
		listOfEntries = new JList(listData.toArray());
		listOfEntries.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		listOfEntries.setLayoutOrientation(JList.VERTICAL);
		listOfEntries.setSize(600, 800);
		listOfEntries.setFixedCellWidth(200);
		listOfEntries.setFixedCellHeight(30);
		
		listScrollPane = new JScrollPane(listOfEntries, 
				JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		
		JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
								listScrollPane, mainContentPanel);
		split.setOneTouchExpandable(true);
		split.setDividerLocation(175);
		
		final DefaultListModel listModel = new DefaultListModel(); 
		listModel.addElement(listData);

		getContentPane().add(split);
       }
       
       private void initFrame() {
		/*
		 * Layout für das Mainframe 
		 */
		getContentPane().setLayout(new BorderLayout());
		setTitle(Constants.FRAME_TITLE);
		setSize(Constants.FRAME_SIZE);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setDefaultLookAndFeelDecorated(true);
		setLocation( (Constants.SCREEN_SIZE.width - getSize().width)/2, 
					 (Constants.SCREEN_SIZE.height - getSize().height)/2);
		setVisible(Constants.FRAME_VISIBILITY);
		
		myMenuBar = new JMenuBar();
		myMenuBar.setBackground(Constants.GRAY);
		file = new JMenu(Constants.MENU_FILE_DE);
		file.setBackground(Constants.GRAY);
		
                /* Beim Klicken auf newPerson öffnet sich das JDialog.*/
		newPerson = new JMenuItem(Constants.MENU_NEW_PERSON_DE);
	        newPerson.addActionListener(new NewPersonActionListenerImpl(newPerson));
		file.add(newPerson);
         }

         // Jetzt folgen nur noch Getter- und Setter-Methoden und die Main-Methode zum Testen

Der Code für den JDialog:

Java:
        public class NewPersonEntryGUI implements ActionListener{
    
    private JTextField         givennameField, secondGivennameField, surenameField, birthdayField, 
                            streetField, houseNumberField, placeField, zipField,
                            emailField, phoneField, mobileField;

    private JLabel                givennameLabel, secondGivennameLabel, surenameLabel, birthdayLabel, 
                            streetLabel, houseNumberLabel, placeLabel, zipLabel,
                            emailLabel, phoneLabel, mobileLabel, pictureLabel;

    private JPanel             mainContentPanel;

    private JPanel             picturePanel;
    
    private JPanel             buttonPanel;

    private JButton         add, cancel, pictureButton;

    private JFileChooser     pictureChooser;
    
    private ImageIcon         pictureIcon;

    private JLabel             pictureContainer;
    
    private static AddressbookEntry entry;
    
    private JDialog dialog = new JDialog();
    
    /**
     * 
     */
    private static final long serialVersionUID = -9135804139088796764L;
    
    public NewPersonEntryGUI() {}
    
    public void initDialog() {
        
        dialog.setLayout(new BorderLayout());
        dialog.setTitle(Constants.NEW_PERSON_TITLE_DE);
        dialog.setSize(Constants.NEW_PERSON_FRAME_SIZE);
        dialog.setLocation((Constants.SCREEN_SIZE.width - dialog.getSize().width)/2, 
                 (Constants.SCREEN_SIZE.height - dialog.getSize().height)/2);
        dialog.setVisible(Constants.NEW_PERSON_VISIBILITY);
        dialog.setAlwaysOnTop(false);
        dialog.setModal(false);
        initContent();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.validate();
        dialog.repaint();
    }
    
    private void initContent() {
        
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints constraints = new GridBagConstraints();
        
        mainContentPanel = new JPanel();
        mainContentPanel.setLayout(gbl);
      
        givennameLabel = new JLabel(Constants.GIVENNAME_LABEL_DE);
        givennameField = new JTextField();
        
        buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(add);
        buttonPanel.add(cancel);
        
        cancel.addActionListener(this);
        pictureButton.addActionListener(this);
        add.addActionListener(this);
        
        int countY = 0;
        
        int none = GridBagConstraints.NONE;
        int horizontal = GridBagConstraints.HORIZONTAL;
        
        constraints.fill = horizontal;
        constraints.gridx = 0;
        constraints.gridy = ++countY;
        constraints.anchor = GridBagConstraints.ABOVE_BASELINE_LEADING;
        constraints.weightx = 1.5;
        constraints.gridwidth = 2;
        constraints.insets = new Insets(5, 5, 5, 50);
        mainContentPanel.add(givennameLabel,constraints);
        
        constraints.fill = horizontal;
        constraints.gridx = 1;
        constraints.gridy = countY;
        constraints.insets = new Insets(5, 50, 5, 50);
        mainContentPanel.add(givennameField, constraints);
        
        dialog.getContentPane().add(mainContentPanel, BorderLayout.CENTER);
        dialog.getContentPane().add(buttonPanel, BorderLayout.SOUTH);

    }
    
    public static void main(String[] args) {
        new NewPersonEntryGUI().initDialog();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(cancel)) {
            dialog.setVisible(false);
        } 
        //Hier sollen eigentlich die Daten vom JDialog in das JFrame rüberwandern. Tun sie aber nicht.
        else if(e.getSource().equals(add)) {
           
            if(!givennameField.getText().equals("") 
                    && givennameField.getText().length() != 0) {
                
                AddressbookGUI.getEntry().getPerson().setGivenname(givennameField.getText());
                AddressbookGUI.getListData().add(givennameField.getText());
                AddressbookGUI.getGivennameField()
                    .setText(givennameField.getText());
            }
            dialog.setVisible(false);
        }        
    }    
}

AddressbookEntry ist eine einfache Container-Klasse, die die Person und deren Adresse enthält.
Wenn ich vergessen habe etwas zu erwähnen, dass zur Lösung helfen würde sagt mir einfach Bescheid.

Was muss ich noch machen damit die Daten vom JDialog in das JFrame rüberwandern?

Vorab vielen Dank für die Hilfe.

Viele Grüße
Edfred
 
Der JDialog sollte eine Referenz auf seinen Parent haben.

Und dort kann er dann eine Methode returnData() oder sowas aufrufen und ihm alles übergeben, was er will.

Es geht auch umgekehrt, dass sich der Parent daten holt aber dann muss dieser auch über das Event informiert werden, wenn der JDialog bereit ist daten zu senden.

Es gibt noch unzählige Varianten...

Ok,..

Ich habe mir mal deinen Code angeschaut: Du willst das ganze statisch machen, was eher ungewöhnlich ist.

Sind die gewünschten Werte den dann in der Liste oder in "Person"?

Ich denke, dass liegt daran, dass wenn du setVisible auf den JDialog machst, dann hat dieser die Kontrolle und wenn du die GuiElemente vom JDialog in dem ParentJframe änderst, dann kann er nix updaten.

Da muss man die Komponenten wohl neu zeichnen.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

danke für deine Hilfe. Ich habe eine Frage zu deinen Tipps. Wie übergebe ich meinem JDialog denn den Parent? Ich möchte diesen Ansatz gerne ausprobieren. Mache ich das am besten im Konstruktor vom Dialog und wenn ja wie genau?

Das mit der statischen Implementierung, ist nur aus der Not geboren. Ich habe versucht direkt auf die JTextFields zuzugreifen und den Inhalt mit getText() zu bekommen und in die Main-GUI zu überführen. Das hat nicht geklappt und daher werde ich den Code wieder von "static" befreien. Ich weiß auch, dass es eine sehr unschöne Methode ist, die ich nicht weiter verfolgen werde. Vor allem, weil es auch nicht funktioniert hat. 🙂

Die Daten wollte ich in der Person speichern und abrufen.

Im JDialog sollen die Daten eingegeben werden die dann in der Main-GUI angezeigt werden sollen. Es wird so zu sagen eine neue Person erstellt und die Daten sollen übernommen werden. Wenn ich auf den Knopf "Übernehmen" klicke, dann soll sich der Dialog schließen und die Daten in der Main-GUI stehen. Wenn ich den Dialog schließe, dann schlie0ßt sich irgendwie auch das Main-GUI. Deswegen habe ich es mit setVisible(false) gelöst.
 
Hallo zusammen,

leider klappt es nicht so wie du es mir beschrieben hast.weiterhin existiert keine Methode in der Klasse JDialog, die man nutzen könnte, um die Daten herüberzuholen.

Ich habe auch dem JDialog den Parent verpasst. Beim debuggen scheinen die Daten dem Parent, aber leider erscheint in der GUI rein gar nichts.

Hier sind meine Änderungen im JDialog:

Java:
public class NewPersonEntryGUI extends JDialog implements ActionListener{
	
	private JTextField 		givennameField, secondGivennameField, surenameField, birthdayField, 
    						streetField, houseNumberField, placeField, zipField,
    						emailField, phoneField, mobileField;

	private JLabel 	   		givennameLabel, secondGivennameLabel, surenameLabel, birthdayLabel, 
							streetLabel, houseNumberLabel, placeLabel, zipLabel,
							emailLabel, phoneLabel, mobileLabel, pictureLabel;

	private JPanel 			mainContentPanel;

	private JPanel 			picturePanel;
	
	private JPanel 			buttonPanel;

	private JButton 		add, cancel, pictureButton;

	private JFileChooser 	pictureChooser;
	
	private ImageIcon 		pictureIcon;

	private JLabel 			pictureContainer;
	/*
         * Erste Änderung
         */
	private AddressbookGUI 	parent; 
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -9135804139088796764L;

	/**
         * Zweite Änderung
         */
	public NewPersonEntryGUI(AddressbookGUI dParent, JFrame aFrame) {
		super(aFrame, true);
		parent = dParent;
	}
      //... Rest des Dialogs.

        @Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource().equals(cancel)) {
			setVisible(false);
		} 
		else if(e.getSource().equals(pictureButton)) {
			pictureContainer = new JLabel();
			pictureContainer.repaint();
			pictureContainer.validate();
			validate();
			pictureChooser = new JFileChooser();
			String picturePath = "";
			FileNameExtensionFilter filter = new FileNameExtensionFilter(
			        "JPG, BMP & GIF Images", "jpg", "gif", "bmp");
			
			pictureChooser.setFileFilter(filter);
			int returnVal = pictureChooser.showOpenDialog(this);
			
			if(returnVal == JFileChooser.APPROVE_OPTION) {
				if(picturePanel != null) {
					picturePanel.removeAll();
					validate();
					picturePanel.validate();
					picturePanel.repaint();
				}
				
				picturePath = pictureChooser.getSelectedFile().getPath();
				System.out.println(picturePath);
				ImageIcon pictureIconTemp = new ImageIcon(picturePath);
				pictureIcon = new ImageIcon(Tools.getScaledImage(pictureIconTemp.getImage(), 200, 180));
				pictureContainer.setIcon(pictureIcon);
				picturePanel.add(pictureContainer);
				validate();
				repaint();	
			}
		}
		else if(e.getSource().equals(add)) {
			
			if(!pictureIcon.getImage().equals(null)) {
				parent.getEntry().getPerson().setPicture(pictureIcon.getImage());
			}
			else parent.getEntry().getPerson().setPicture(
					new ImageIcon("/Users/eddifakhouri/Programmierung/Addressbook/Adressbook/images/noPhotoIcon.gif").getImage());
			
			if(!givennameField.getText().equals("") 
					&& givennameField.getText().length() != 0) {
				
				 parent.getEntry().getPerson().setGivenname(givennameField.getText());
				 parent.getListData().add(givennameField.getText());
				 parent.getGivennameField().setText(givennameField.getText());
			}
			this.setVisible(false);
			
			parent.getFrame().validate();
			parent.getFrame().repaint();
		}

Änderung in der Main-GUI:

Java:
public class AddressbookGUI implements ActionListener{

	/**
	 * Autogenerated serial version ID
	 */
	private static final long 			serialVersionUID = -4103836616194940083L;
	
	private JTextField 					givennameField, secondGivennameField, surenameField, birthdayField, 
										streetField, houseNumberField, placeField, zipField,
										emailField, phoneField, mobileField;
	
	private JLabel 	   					givennameLabel, secondGivennameLabel, surenameLabel, birthdayLabel, 
										streetLabel, houseNumberLabel, placeLabel, zipLabel,
										emailLabel, phoneLabel, mobileLabel, pictureLabel;
	
	private JList 	   					listOfEntries;
	
	private JPanel	   					picturePanel;
	
	private JPanel						mainContentPanel;
	
	private JScrollPane 				listScrollPane;
		
	private JMenuBar 					myMenuBar;
	
	private JMenu 						file;
	
	private JMenuItem 					newPerson, close, savetoDatabase, saveToFile;
	
	private ImageIcon 					profilePicture;
	
	private AddressbookEntry 			entry;
	/**
         * Erste Änderung
         */
	private JFrame 						frame;
	
	private ArrayList<String> 			listData = new ArrayList<String>();
	

	
	public AddressbookGUI() {
		this.entry = new AddressbookEntry();
		
	}
	
	
	public void createView() {
		
		initLabelsAndFields();
		
		initContent();
				
		initFrame();

	}

        // Weitere Aufbau der GUI und Dekleration der Methoden, die in der createView() benutzt werden

     /**
     * Zweite Änderung
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(newPerson)) {
            new NewPersonEntryGUI(this, frame).initDialog();
        }
        
    }

Ich hab die Main-GUI von "static" befreit.

Hat jemand eine Lösung parat? Ich tappe im Dunkeln. ...

Gruß
Edfred
 
Danke Marcinek,

deine Lösung hat es gebracht. Ich hab dem JDialog einfach die MainGUI als parent übergeben und dann lief es.:toll:
 

Zurück
Oben