Hallo,
ich bin momentan ein wenig mit JavaFX am rumspielen und wollte folgendes machen:
Ich habe eine Gui mit JavaFX aufgebaut. Dort habe ich 3 Buttons und 1 Label.
Ich möchte aus Testgründen, dass er die Farbe vom VBox Hintergrund beim Klick auf Einzahlen ändert.
Das funktioniert auch wunderbar.
Als nächsten Schritt möchte ich, dass er die Farben nach Klick auf Einzahlen im Sekundentakt(z.b.1s, sollte variabel sein) ändert.
Hierfür habe ich eine Methode, die er aufruft wenn ich auf den Button klicke, die changeBackground heißt.
In dieser Methode ändere ich den Hintergrund, warte mit Thread.sleep(1000); und rufe dann die Methode changeBackground erneut auf.
Das einzige was dann aber passiert ist nichts. (Er arbeitet und arbeitet) Ich habe mal probiert die Methode mehrmals zu kopieren und changeBackground2,3,4 usw genannt.
Mir ist aufgefallen, dass er die Hintergrundfarbe ändert, wartet, ändert, wartet, was er ja auch soll. Allerdings erst wenn das vorbei ist, zeigt mir meine kleine Gui die letzte Farbe an. Also sie aktualisiert sich erst am Ende der Vorgänge.
Wie kann ich das programmieren, dass er die Gui neu zeichnet, nachdem er die Hintergrundfarbe gewechselt hat?
Mein Code:
[CODE lang="java" title="Main"]package sample;
public class Main {
public static void main(String[] args) {
Gui gui = new Gui();
gui.launcher(args);
}
}
[/CODE]
[CODE lang="java" title="Gui Klasse"]package sample;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Background;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class Gui extends Application {
private int textSize = 30;
private String kontoinhaber = "Peter Lustig";
private VBox vbox;
private int i = 0;
// private ArrayList<Background> b2 = getBackgroundArrayList();
private Background[] background = getBackgroundArray();
@Override
public void start(Stage stage) {
try {
VBox vbox = new VBox();
//vbox.setBackground(FXBackground.BLACK);
// vbox
Scene mainMenu = new Scene(vbox);
Label lblWelcome = new Label("Herzlich Willkommen\n" + kontoinhaber);
lblWelcome.setFont(new Font("Arial", textSize));
// lblWelcome.setBackground(new Background(new BackgroundFill(Color.rgb(250,250,250), CornerRadii.EMPTY, Insets.EMPTY)));
lblWelcome.setBackground(FXBackground.PINK);
Button btnEinzahlen = new Button("Einzahlen");
Button btnAuszahlen = new Button("Auszahlen");
Button btnSenden = new Button("Überweisen");
btnEinzahlen.setPrefSize(400, 100);
btnAuszahlen.setPrefSize(400, 100);
btnSenden.setPrefSize(400, 100);
btnEinzahlen.setFont(new Font("Arial", textSize));
btnAuszahlen.setFont(new Font("Arial", textSize));
btnSenden.setFont(new Font("Arial", textSize));
// btnEinzahlen.setStyle("-fx-background-image: url(/test.bmp)");
// btnAuszahlen.setStyle("-fx-background-image: url(/test.bmp)");
btnEinzahlen.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
System.out.println("HALLO");
System.out.println(i);
changeBackground();
}
});
vbox.setPrefSize(600, 650);
vbox.setSpacing(50); //Abstand zwischen den Nodes
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().add(lblWelcome);
vbox.getChildren().add(btnEinzahlen);
vbox.getChildren().add(btnAuszahlen);
vbox.getChildren().add(btnSenden);
stage.setScene(mainMenu);
stage.show();
this.vbox = vbox;
} catch (Exception e) {
e.printStackTrace();
}
}
public Background[] getBackgroundArray() {
Background[] backgrounds = new Background[12];
backgrounds[0] = FXBackground.WHITE;
backgrounds[1] = FXBackground.LIGHT_GRAY;
backgrounds[2] = FXBackground.GRAY;
backgrounds[3] = FXBackground.BLACK;
backgrounds[4] = FXBackground.RED;
backgrounds[5] = FXBackground.PINK;
backgrounds[6] = FXBackground.ORANGE;
backgrounds[7] = FXBackground.YELLOW;
backgrounds[8] = FXBackground.GREEN;
backgrounds[9] = FXBackground.MAGENTA;
backgrounds[10] = FXBackground.CYAN;
backgrounds[11] = FXBackground.BLUE;
return backgrounds;
}
// public ArrayList<Background> getBackgroundArrayList() {
// ArrayList<Background> backgrounds = new ArrayList<Background>();
// int maxx = 15;
// for (int r = 0; r < maxx; r++) {
// for (int g = 0; g < maxx; g++) {
// for (int b = 0; b < maxx; b++) {
// backgrounds.add(FXBackground.getBackground(r, g, b));
// }
// }
// }
// return backgrounds;
// }
public void changeBackground() {
this.vbox.setBackground(this.background);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if (i == 12) i = 0;
changeBackground();
}
public void launcher(String[] args) {
launch(args);
}
}[/CODE]
[CODE lang="java" title="FXBackground Klasse"]package sample;
import javafx.geometry.Insets;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.paint.Color;
public class FXBackground {
private static Background background;
static Background getBackground(int r, int g, int b){
background = new Background(new BackgroundFill(Color.rgb(r,g,b), CornerRadii.EMPTY, Insets.EMPTY));
//
System.out.println("R= " + r + " G= " + g + " B= " + b);
return background;
}
public static final java.awt.Color darkGray = new java.awt.Color(64, 64, 64);
public static final Background DARK_GRAY = getBackground(64,64,64);
public static final Background WHITE = getBackground(255,255,255);
public static final Background LIGHT_GRAY = getBackground(192,192,192);
public static final Background GRAY = getBackground(128,128,128);
public static final Background BLACK = getBackground(0,0,0);
public static final Background RED = getBackground(255,0,0);
public static final Background PINK = getBackground(255,175,175);
public static final Background ORANGE = getBackground(255,200,0);
public static final Background YELLOW = getBackground(255,255,0);
public static final Background GREEN = getBackground(0,255,0);
public static final Background MAGENTA = getBackground(255,0,255);
public static final Background CYAN = getBackground(0,255,255);
public static final Background BLUE = getBackground(0,0,255);
}[/CODE]
ich bin momentan ein wenig mit JavaFX am rumspielen und wollte folgendes machen:
Ich habe eine Gui mit JavaFX aufgebaut. Dort habe ich 3 Buttons und 1 Label.
Ich möchte aus Testgründen, dass er die Farbe vom VBox Hintergrund beim Klick auf Einzahlen ändert.
Das funktioniert auch wunderbar.
Als nächsten Schritt möchte ich, dass er die Farben nach Klick auf Einzahlen im Sekundentakt(z.b.1s, sollte variabel sein) ändert.
Hierfür habe ich eine Methode, die er aufruft wenn ich auf den Button klicke, die changeBackground heißt.
In dieser Methode ändere ich den Hintergrund, warte mit Thread.sleep(1000); und rufe dann die Methode changeBackground erneut auf.
Das einzige was dann aber passiert ist nichts. (Er arbeitet und arbeitet) Ich habe mal probiert die Methode mehrmals zu kopieren und changeBackground2,3,4 usw genannt.
Mir ist aufgefallen, dass er die Hintergrundfarbe ändert, wartet, ändert, wartet, was er ja auch soll. Allerdings erst wenn das vorbei ist, zeigt mir meine kleine Gui die letzte Farbe an. Also sie aktualisiert sich erst am Ende der Vorgänge.
Wie kann ich das programmieren, dass er die Gui neu zeichnet, nachdem er die Hintergrundfarbe gewechselt hat?
Mein Code:
[CODE lang="java" title="Main"]package sample;
public class Main {
public static void main(String[] args) {
Gui gui = new Gui();
gui.launcher(args);
}
}
[/CODE]
[CODE lang="java" title="Gui Klasse"]package sample;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Background;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class Gui extends Application {
private int textSize = 30;
private String kontoinhaber = "Peter Lustig";
private VBox vbox;
private int i = 0;
// private ArrayList<Background> b2 = getBackgroundArrayList();
private Background[] background = getBackgroundArray();
@Override
public void start(Stage stage) {
try {
VBox vbox = new VBox();
//vbox.setBackground(FXBackground.BLACK);
// vbox
Scene mainMenu = new Scene(vbox);
Label lblWelcome = new Label("Herzlich Willkommen\n" + kontoinhaber);
lblWelcome.setFont(new Font("Arial", textSize));
// lblWelcome.setBackground(new Background(new BackgroundFill(Color.rgb(250,250,250), CornerRadii.EMPTY, Insets.EMPTY)));
lblWelcome.setBackground(FXBackground.PINK);
Button btnEinzahlen = new Button("Einzahlen");
Button btnAuszahlen = new Button("Auszahlen");
Button btnSenden = new Button("Überweisen");
btnEinzahlen.setPrefSize(400, 100);
btnAuszahlen.setPrefSize(400, 100);
btnSenden.setPrefSize(400, 100);
btnEinzahlen.setFont(new Font("Arial", textSize));
btnAuszahlen.setFont(new Font("Arial", textSize));
btnSenden.setFont(new Font("Arial", textSize));
// btnEinzahlen.setStyle("-fx-background-image: url(/test.bmp)");
// btnAuszahlen.setStyle("-fx-background-image: url(/test.bmp)");
btnEinzahlen.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
System.out.println("HALLO");
System.out.println(i);
changeBackground();
}
});
vbox.setPrefSize(600, 650);
vbox.setSpacing(50); //Abstand zwischen den Nodes
vbox.setAlignment(Pos.CENTER);
vbox.getChildren().add(lblWelcome);
vbox.getChildren().add(btnEinzahlen);
vbox.getChildren().add(btnAuszahlen);
vbox.getChildren().add(btnSenden);
stage.setScene(mainMenu);
stage.show();
this.vbox = vbox;
} catch (Exception e) {
e.printStackTrace();
}
}
public Background[] getBackgroundArray() {
Background[] backgrounds = new Background[12];
backgrounds[0] = FXBackground.WHITE;
backgrounds[1] = FXBackground.LIGHT_GRAY;
backgrounds[2] = FXBackground.GRAY;
backgrounds[3] = FXBackground.BLACK;
backgrounds[4] = FXBackground.RED;
backgrounds[5] = FXBackground.PINK;
backgrounds[6] = FXBackground.ORANGE;
backgrounds[7] = FXBackground.YELLOW;
backgrounds[8] = FXBackground.GREEN;
backgrounds[9] = FXBackground.MAGENTA;
backgrounds[10] = FXBackground.CYAN;
backgrounds[11] = FXBackground.BLUE;
return backgrounds;
}
// public ArrayList<Background> getBackgroundArrayList() {
// ArrayList<Background> backgrounds = new ArrayList<Background>();
// int maxx = 15;
// for (int r = 0; r < maxx; r++) {
// for (int g = 0; g < maxx; g++) {
// for (int b = 0; b < maxx; b++) {
// backgrounds.add(FXBackground.getBackground(r, g, b));
// }
// }
// }
// return backgrounds;
// }
public void changeBackground() {
this.vbox.setBackground(this.background);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
if (i == 12) i = 0;
changeBackground();
}
public void launcher(String[] args) {
launch(args);
}
}[/CODE]
[CODE lang="java" title="FXBackground Klasse"]package sample;
import javafx.geometry.Insets;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.paint.Color;
public class FXBackground {
private static Background background;
static Background getBackground(int r, int g, int b){
background = new Background(new BackgroundFill(Color.rgb(r,g,b), CornerRadii.EMPTY, Insets.EMPTY));
//
System.out.println("R= " + r + " G= " + g + " B= " + b);
return background;
}
public static final java.awt.Color darkGray = new java.awt.Color(64, 64, 64);
public static final Background DARK_GRAY = getBackground(64,64,64);
public static final Background WHITE = getBackground(255,255,255);
public static final Background LIGHT_GRAY = getBackground(192,192,192);
public static final Background GRAY = getBackground(128,128,128);
public static final Background BLACK = getBackground(0,0,0);
public static final Background RED = getBackground(255,0,0);
public static final Background PINK = getBackground(255,175,175);
public static final Background ORANGE = getBackground(255,200,0);
public static final Background YELLOW = getBackground(255,255,0);
public static final Background GREEN = getBackground(0,255,0);
public static final Background MAGENTA = getBackground(255,0,255);
public static final Background CYAN = getBackground(0,255,255);
public static final Background BLUE = getBackground(0,0,255);
}[/CODE]