Czy to mogę w ten sposób dodawać komponent do GUI?

0

Cześć, mam pytanie, czy coś takiego co zapisałem poniżej jest poprawne jeśli chodzi o styl programistyczny? Generalnie to dopiero moje początki z Javą, a niestety o ile książka, z której korzystam jestem bardzo zadowolony, to o tyle rozdział na temat GUI został potraktowany moim zdaniem lekko po macoszemu.

import java.awt.*;
import javax.swing.*;
public
class MyComponent extends JComponent {
 public
  String tekst;
 public
  int xY;
 public
  int xF;
 public
  void paintComponent(Graphics g) { g.drawString(tekst, xF, xY); }
 public
  MyComponent(String tekstDoFunkcji, int x, int y) {
    tekst = tekstDoFunkcji;
    xF = x;
    xY = y;
  }
}

oraz klasa CreateFrame()

import java.awt.*;
import javax.swing.*;
public
class CreateFrame extends JFrame {
  JFrame frame;
  CreateFrame() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    pack();
    add(new MyComponent("Słowo", 500, 500));
    repaint();
  }
}
4

Co to za dziwna notacja? Widzac to 'public \n\t foo' mialem wrazenie ze to jakas hybryda Javy z C++.

Tylko ze w C++ wystarczy jeden public :v.

A GUI potraktowane po macoszemu bo GUI sie prawie nie pisze. Jak chcesz sie pobawic GUI to przeskocz od razu na JaveFX a nie w swingu sie babrasz:)

2

Tak jak kolega wyżej napisał: o ile nie robisz tego z jakiegoś zamiłowania, to porzuć swinga, nie wspominając o awt. Nawet JavaFX jest mało przydatna w wykorzystaniu praktycznym Javy. Po co to robisz? Jak chcesz robić deskop to zły język.

2

Dobra ale może dla odmiany coś na temat :D
Nie wiem dokładnie o co pytasz, ale tak, można tak dodawac komponenty do UI. Przy czym zwykle jednak masz tam ustawiony jakiś layout i wszystko jest osadzone w milionie paneli, bo inaczej wygląda jak kupa.
No i istnieje już komponent JLabel ;)

0

Mam zrobić projekt zaliczeniowy z Javy w GUI i mój profesor, który nie cieszy się najlepszą opinią polecił nam właśnie swinga i awt. Cóż, coraz bardziej upewniam się, że opinia ta nie jest bezpodstawna ;)

Czyli zatem szukam książki do Java FX. Dzięki za informację ;)

2

Nie wiem czy ksiazka to dobry poczatek. Potrzebujesz bardziej jakichs przykladow i dokumentacji

0

Póki co mam problem z IntelliJ, ustawiłem dobrze ścieżkę do javaFX w opcji VM - wygląda ona tak:

--module-path "C:\javafx15\lib" --add-modules javafx.controls,javafx.fxml

ponadto dodałem plik module JavaFX

module JavaFX {
    requires javafx.fxml;
    requires javafx.controls;

    opens sample;
}

i mam taki błąd:

"C:\Program Files\Java\jdk-12.0.2\bin\java.exe" --module-path C:\javafx15\lib --add-modules javafx.controls,javafx.fxml --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=59240:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -m JavaFX/Main
Error occurred during initialization of boot layer
java.lang.module.FindException: Module JavaFX not found

Process finished with exit code 1

Może jestem ślepy, ale google nie widzi innego rozwiązania niż sprawdzenie adresu w ustawieniach maszyny wirtualnej. Który jest poprawny.

2

JavaFX stala sie modulem rozwijanym niezaleznie od Javy 10 czy tam 11. Zeby z niej korzystac pobierz FX SDK albo skorzystaj z JDK8, ktory ma FX wbudowane

https://openjfx.io/openjfx-docs/

Edit: FX SDK chyba juz pobrales. Sprobuj tak: https://www.jetbrains.com/help/idea/javafx.html#

0

Kurcze, wydaje mi się, że zrobiłem to dobrze. W snesie ustawiłem adres i wszystko według tego poradnika.

Niektóre programy działają. A niektóre nie.

2

Tzn. czesc przykladow mozesz odpalic a inne nie? Moze to kwestia tego co masz w gradle.

0

Dokładnie, konkretniej mówię o tym.

1 i 2 mogę. Resztę nie

https://www.geeksforgeeks.org/javafx-button-with-examples/

0

Już wiem. Mam małe obserwacje.

Bez pliku module działają pierwsze dwa. Z plikiem module żadne i przy każdym jest ten sam błąd. Jeśli go usunę to mam:

Exception in Application start method
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:567)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
	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:567)
	at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.io.FileNotFoundException: f:\gfg.png (System nie może odnaleźć określonej ścieżki)
	at java.base/java.io.FileInputStream.open0(Native Method)
	at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155)
	at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110)
	at Main.start(Main.java:23)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	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(AccessController.java:389)
	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
Exception running application Main

przy trzecim.

1

Caused by: java.io.FileNotFoundException: f:\gfg.png (System nie może odnaleźć określonej ścieżki)

1

Ja wiem, że poradniki są po to aby się na nich wzorować. Ale po to masz mózg aby go używać i patrzeć co jest w poradniku. Przede wszystkim powinieneś czytać komunikaty błędów (czytanie stacktracea to bardzo ważna umiejętność!).

Podaj poprawną ścieżkę do pliku i będzie ok :)

1

PS: mozna tez tak https://gluonhq.com/products/scene-builder/
a najlepiej tak https://tornadofx.io/ (ale Kotlin to juz offtop i moze poki co zostan przy javie jesli tylko projekt chcesz skonczyc)

0

poprawiłem ścieżkę pliku ale dalej jest cała masa błędów

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x73b45141) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x73b45141
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
	at javafx.scene.control.Control.<clinit>(Control.java:86)
	at Main.start(Main.java:32)
	at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	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(AccessController.java:391)
	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

Generalnie spróbuję pobrać może JDK14. Może to coś da

1

Pobierz JDK8 jesli 14 nie zadziala

0

Nie mam pojęcia co się stało, ale JDK14 i JavaFX15 jakimś cudem zadziałały i wszystko działa bardzo dobrze. Dzięki wielkie za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1