Hallo, ich möchte ein Kontaktbuch erstellen in JavaFX mittels eclipse erstellen.
Die Vorgaben sind, dass model (Klasse Contacts) und view (Klasse Show Contacts) zu trennen sind. Allerdings habe ich mittels Testzwecke die Klasse "Show Contacts" vom package view nach application geschoben. So funktioniert erstmal die Ausgabe, welche allerdings nur den Titel ausgibt und das Label "Kontaktbuch" angezeigt, alle anderen Daten werden nicht übernommen (Name, Vorname, Email, Foto), das Fenster bleibt leer. Eine Fehlermeldung erscheint allerdings auch nicht, wodurch ich sehr ratlos bin.
Hier ist der Code der Klasse Show Contacts:
[CODE lang="java" title="Klasse ShowContacts"]package application;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import model.Contacts;
/*
* @author
* @version 1.1
*/
public class ShowContacts extends Application {
@Override
public void start (Stage primaryStage) {
try {
ScrollPane root1 = new ScrollPane();
VBox box = new VBox();
box.setSpacing(20);
ArrayList<Contacts> contacts = new ArrayList<>();
for (Contacts h : contacts ) {
GridPane contactsPane = showContacts(h);
box.getChildren().add(contactsPane);
}
root1.setContent(box);
primaryStage.setTitle("Kontaktbuch Test");
primaryStage.show();
GridPane root2 = new GridPane();
root2.add(new Label("Kontaktbuch"), 0, 0);
primaryStage.setScene(new Scene(root2,900,900));
Contacts otter = new Contacts("Otter", "Olaf", "otter.jpg");
otter.hinzufuegenMail("Otter@otterbau.com");
otter.hinzufuegenMail("harry@otter.com");
otter.hinzufuegenMail("otter@otter");
contacts.add(otter);
Contacts quokka = new Contacts ("Quokka", "Querry", "quokka.jpg");
quokka.hinzufuegenMail("suess@quokka.de");
quokka.hinzufuegenMail("quo@kka.de");
quokka.hinzufuegenMail("quokka@test.de");
contacts.add(quokka);
} catch(Exception e) {
e.printStackTrace();
}
}
private GridPane showContacts (Contacts h) {
GridPane root = new GridPane();
// horizontal gap and vertical gap between columns and lines
root.setHgap(10);
root.setVgap(10);
//limit the width of columns
//gives a limit to column 0
// root.getColumnConstraints().add(new ColumnConstraints(100));
//gives a limit to column 1
// root.getColumnConstraints().add(new ColumnConstraints(140));
// an Insets defines the space around a region
// here space will be added around the grid
root.setPadding(new Insets(25, 25, 25, 25));
root.setPadding(new Insets(25, 25, 25, 25));
Label vorname = new Label("Vorname: "+h.getVorname());
root.add(vorname, 1, 1);
Label nachname = new Label("Nachname: "+h.getName());
root.add(nachname, 1,2);
Image image = new Image (getClass().
getResource("/resources/"+h.getFoto()).toString());
ImageView imageview = new ImageView(image);
root.add(imageview, 1, 0);
Label emails = new Label("Emailadresse: ");
root.add(emails,1, 3);
root.add(showEmail(h), 1, 4, 2, 1);
return root;
}
private ScrollPane showEmail (Contacts h) {
GridPane root = new GridPane();
root.setHgap(5);
root.setVgap(5);
root.setPadding(new Insets(8, 8, 8, 8));
int row = 0;
// the rows of root are dynamically allocated
ArrayList<String> email = h.getEmail();
for (int i=0; i<h.getEmail().size(); i++) {
String e = email.get(i);
root.add(new Label(e), 1, row);
row++;
}
ScrollPane pane = new ScrollPane();
pane.setContent(root);
return pane;
}
public static void main(String[] args) {
launch(args);
}
}[/CODE]
und hier meine Klasse Contacts:
[CODE lang="java" title="Contacts"]package model;
import java.util.ArrayList;
/*
* @author
* @version 1.1
*/
public class Contacts {
protected String name;
protected String vorname;
protected String foto; //Name der Datei die das Foto enthält
protected ArrayList<String> emailadressen;
public Contacts(String name, String vorname, String foto) {
this.name = name;
this.vorname = vorname;
if (foto != null) {
this.foto = foto;
}else {
this.foto = "nophoto.jpg";
}
emailadressen = new ArrayList<>();
}
/**
* getter fuer den Namen
* @return Name des Kontakts
*/
public String getName() {
return name;
}
/**
* getter fuer den Vornamen
* @return Vorname des Kontakts
*/
public String getVorname(){
return vorname;
}
/**
* getter fuer den Namen der Datei, die das Foto enthaelt
* @return Name der Datei, die das Foto des Kontakts enthaelt
*/
public String getFoto(){
return foto;
}
/**
* getter fuer die liste Email
* @return die liste von Emailadressen
*/
public ArrayList<String> getEmail(){
return emailadressen;
}
@Override
public String toString(){
return vorname +" "+ name +" " +"\n "+emailadressen.toString();
}
public void hinzufuegenMail(String email) {
if (email.length() >= 3 && email.contains("@")
&& email.charAt(0)!='@' && email.charAt(email.length()-1) != '@') {
emailadressen.add(email);
}else {
System.out.println("Ungültige eMail! ");
}
}
// main method for testing
public static void main(String[] args) {
Contacts otter = new Contacts("Otter", "Olaf", "/resources/otter.jpg");
otter.hinzufuegenMail("otter@otterbau.com");
System.out.println(otter);
}
public Contacts() {
// TODO Auto-generated constructor stub
}
}[/CODE]
Möglicherweise liegt der Fehler darin, dass ich ShowContacts aus dem package view nach application geschoben habe.
Sobald ich allerdings ShowContacts wieder in das package view schiebe ist das Programm nicht mehr ausführbar, folgende Fehlermeldung erscheint:
Exception in Application constructor
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class view.ShowContacts
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class view.ShowContacts (in module FXGE1Contacts) because module FXGE1Contacts does not export view to module javafx.graphics
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:802)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
... 1 more
Unter den Run Configurations habe ich die VM-Arguments angepasst, dennoch funktioniert es nicht.
Vielleicht kann mir ja jemand helfen!
Die Vorgaben sind, dass model (Klasse Contacts) und view (Klasse Show Contacts) zu trennen sind. Allerdings habe ich mittels Testzwecke die Klasse "Show Contacts" vom package view nach application geschoben. So funktioniert erstmal die Ausgabe, welche allerdings nur den Titel ausgibt und das Label "Kontaktbuch" angezeigt, alle anderen Daten werden nicht übernommen (Name, Vorname, Email, Foto), das Fenster bleibt leer. Eine Fehlermeldung erscheint allerdings auch nicht, wodurch ich sehr ratlos bin.
Hier ist der Code der Klasse Show Contacts:
[CODE lang="java" title="Klasse ShowContacts"]package application;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import model.Contacts;
/*
* @author
* @version 1.1
*/
public class ShowContacts extends Application {
@Override
public void start (Stage primaryStage) {
try {
ScrollPane root1 = new ScrollPane();
VBox box = new VBox();
box.setSpacing(20);
ArrayList<Contacts> contacts = new ArrayList<>();
for (Contacts h : contacts ) {
GridPane contactsPane = showContacts(h);
box.getChildren().add(contactsPane);
}
root1.setContent(box);
primaryStage.setTitle("Kontaktbuch Test");
primaryStage.show();
GridPane root2 = new GridPane();
root2.add(new Label("Kontaktbuch"), 0, 0);
primaryStage.setScene(new Scene(root2,900,900));
Contacts otter = new Contacts("Otter", "Olaf", "otter.jpg");
otter.hinzufuegenMail("Otter@otterbau.com");
otter.hinzufuegenMail("harry@otter.com");
otter.hinzufuegenMail("otter@otter");
contacts.add(otter);
Contacts quokka = new Contacts ("Quokka", "Querry", "quokka.jpg");
quokka.hinzufuegenMail("suess@quokka.de");
quokka.hinzufuegenMail("quo@kka.de");
quokka.hinzufuegenMail("quokka@test.de");
contacts.add(quokka);
} catch(Exception e) {
e.printStackTrace();
}
}
private GridPane showContacts (Contacts h) {
GridPane root = new GridPane();
// horizontal gap and vertical gap between columns and lines
root.setHgap(10);
root.setVgap(10);
//limit the width of columns
//gives a limit to column 0
// root.getColumnConstraints().add(new ColumnConstraints(100));
//gives a limit to column 1
// root.getColumnConstraints().add(new ColumnConstraints(140));
// an Insets defines the space around a region
// here space will be added around the grid
root.setPadding(new Insets(25, 25, 25, 25));
root.setPadding(new Insets(25, 25, 25, 25));
Label vorname = new Label("Vorname: "+h.getVorname());
root.add(vorname, 1, 1);
Label nachname = new Label("Nachname: "+h.getName());
root.add(nachname, 1,2);
Image image = new Image (getClass().
getResource("/resources/"+h.getFoto()).toString());
ImageView imageview = new ImageView(image);
root.add(imageview, 1, 0);
Label emails = new Label("Emailadresse: ");
root.add(emails,1, 3);
root.add(showEmail(h), 1, 4, 2, 1);
return root;
}
private ScrollPane showEmail (Contacts h) {
GridPane root = new GridPane();
root.setHgap(5);
root.setVgap(5);
root.setPadding(new Insets(8, 8, 8, 8));
int row = 0;
// the rows of root are dynamically allocated
ArrayList<String> email = h.getEmail();
for (int i=0; i<h.getEmail().size(); i++) {
String e = email.get(i);
root.add(new Label(e), 1, row);
row++;
}
ScrollPane pane = new ScrollPane();
pane.setContent(root);
return pane;
}
public static void main(String[] args) {
launch(args);
}
}[/CODE]
und hier meine Klasse Contacts:
[CODE lang="java" title="Contacts"]package model;
import java.util.ArrayList;
/*
* @author
* @version 1.1
*/
public class Contacts {
protected String name;
protected String vorname;
protected String foto; //Name der Datei die das Foto enthält
protected ArrayList<String> emailadressen;
public Contacts(String name, String vorname, String foto) {
this.name = name;
this.vorname = vorname;
if (foto != null) {
this.foto = foto;
}else {
this.foto = "nophoto.jpg";
}
emailadressen = new ArrayList<>();
}
/**
* getter fuer den Namen
* @return Name des Kontakts
*/
public String getName() {
return name;
}
/**
* getter fuer den Vornamen
* @return Vorname des Kontakts
*/
public String getVorname(){
return vorname;
}
/**
* getter fuer den Namen der Datei, die das Foto enthaelt
* @return Name der Datei, die das Foto des Kontakts enthaelt
*/
public String getFoto(){
return foto;
}
/**
* getter fuer die liste Email
* @return die liste von Emailadressen
*/
public ArrayList<String> getEmail(){
return emailadressen;
}
@Override
public String toString(){
return vorname +" "+ name +" " +"\n "+emailadressen.toString();
}
public void hinzufuegenMail(String email) {
if (email.length() >= 3 && email.contains("@")
&& email.charAt(0)!='@' && email.charAt(email.length()-1) != '@') {
emailadressen.add(email);
}else {
System.out.println("Ungültige eMail! ");
}
}
// main method for testing
public static void main(String[] args) {
Contacts otter = new Contacts("Otter", "Olaf", "/resources/otter.jpg");
otter.hinzufuegenMail("otter@otterbau.com");
System.out.println(otter);
}
public Contacts() {
// TODO Auto-generated constructor stub
}
}[/CODE]
Möglicherweise liegt der Fehler darin, dass ich ShowContacts aus dem package view nach application geschoben habe.
Sobald ich allerdings ShowContacts wieder in das package view schiebe ist das Programm nicht mehr ausführbar, folgende Fehlermeldung erscheint:
Exception in Application constructor
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class view.ShowContacts
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class view.ShowContacts (in module FXGE1Contacts) because module FXGE1Contacts does not export view to module javafx.graphics
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:802)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
... 1 more
Unter den Run Configurations habe ich die VM-Arguments angepasst, dennoch funktioniert es nicht.
Vielleicht kann mir ja jemand helfen!