2017-03-22 4 views
0

Also, ich bin ziemlich neu in JavaFX und versuche eine Anwendung mit einem transparenten Hintergrund und zwei roten Kreisen zu erstellen. Die Kreise erscheinen (im kleinen Vorschaufenster), wenn ich über das App-Symbol in meiner Taskleiste schwebe, aber nicht auf dem Bildschirm erscheint.Probleme beim Anzeigen der Zeichenfläche auf dem Bildschirm JavaFX

EDIT: Mit der Screen-Klasse anstelle der AWT-Sachen repariert es.

Mein Code ist:

package com.razorrider7.touchgame; 

import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import java.awt.Toolkit; 
import java.io.File; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

import com.razorrider7.touchgame.manager.SettingsManager; 

public class TouchGame extends Application { 

public static String dataFolder = System.getenv("APPDATA") + File.separator + "TouchGame"; 

@Override 
public void start(Stage stage) throws Exception { 
SettingsManager.setup(); 
initUI(stage); 
} 

private void initUI(Stage stage) { 

stage.setResizable(false); 

// Make the window transparent 
stage.initStyle(StageStyle.TRANSPARENT); 

Pane pane = new Pane(); 

double width = getBounds().getWidth(), height = getBounds().getHeight(); 

stage.setWidth(width); 
stage.setHeight(height); 
stage.setX(0); 
stage.setY(0); 


// Create new canvases for the left and right joysticks 
Canvas joy1 = new Canvas(), joy2 = new Canvas(); 

joy1.setWidth(Math.rint(width/6)); 
joy1.setHeight(Math.rint(width/6)); 
joy2.setWidth(Math.rint(width/6)); 
joy2.setHeight(Math.rint(width/6)); 

joy1.setTranslateX(0); 
joy1.setTranslateY(height - width/6); 
joy2.setTranslateX(width - width/6); 
joy2.setTranslateY(height - width/6); 

// Draw the joysticks 
drawJoy(joy1); 
drawJoy(joy2); 

pane.getChildren().add(joy1); 
pane.getChildren().add(joy2); 

Scene scene = new Scene(pane); 
stage.setScene(scene); 
stage.setTitle("TouchGame"); 
stage.setAlwaysOnTop(true); 
stage.show(); 
} 

private void drawJoy(Canvas canvas) { 
GraphicsContext gc = canvas.getGraphicsContext2D(); 
gc.setStroke(Color.RED); 
gc.setFill(Color.RED); 
gc.fillOval(1, 1, canvas.getWidth() - 1, canvas.getHeight() - 1); 
} 

public Rectangle getBounds() { 
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
Rectangle bounds = gd.getDefaultConfiguration().getBounds(); 
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration()); 

Rectangle safebounds = new Rectangle(bounds); 
safebounds.x += insets.left; 
safebounds.y += insets.top; 
safebounds.width -= (insets.left + insets.right); 
safebounds.height -= (insets.top + insets.bottom); 
return safebounds; 
} 
+0

Funktioniert für mich, Kreise zeigen kein Problem (OS X, Java 8u72). Ich empfehle, dass Sie keine UI-Toolkits mischen und alle 'java.awt'-Importe aus Ihrem Programm entfernen. Außerdem ist es in der Regel einfacher, das Szenengraph als eine Leinwand zu programmieren. – jewelsea

+0

Vielleicht können Sie versuchen, Ihren AWT-Code durch die Klasse JavaFX [Screen] (https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Screen.html) zu ersetzen. – jewelsea

+0

Ja, das war es. Mit der Screen-Klasse wurde das Problem behoben. Vielen Dank! – razorrider7

Antwort

Verwandte Themen