我正在尝试创建一个自定义标签类型,该类型将包含一个“淡出”函数。这用于显示将闪烁然后隐藏的消息。
我正在使用Eclipse、SceneBuilder和Javafx。我不知道该怎么做,也不知道是否可能,但到目前为止,我已经做到了:
import javafx.scene.control.Label;
import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JLabel;
public class TimedMessage extends Label {
private int countBy;
private final String SUCCESS_COL = "#0bbf41";
private final String FAIL_COL = "red";
private int counter;
private Timer messageTimer;
public TimedMessage(int countBy) {
this.countBy = countBy;
}
public void showMessage(boolean success, String message) {
//function to show message
/*
* To use: showMessage(false, "error"); or showMessage(true, "nice");
* Need:
* import javafx.scene.control.Label;
* import java.text.DecimalFormat;
* import java.util.Timer;
* import java.util.TimerTask;
*/
this.setVisible(true); //show message label
this.setOpacity(1); //set initial opacity to 1
this.setText(message); //set the message's text
if (success) {
this.setStyle("-fx-text-fill: "+SUCCESS_COL);//set green
}else {
this.setStyle("-fx-text-fill: "+FAIL_COL);//set red
}
// Create new Timer
messageTimer = new Timer();
counter = 0; //should start from 0; do not change this value
//messageTimer.scheduleAtFixedRate(messageTask, 5, 5);
messageTimer.scheduleAtFixedRate(
new TimerTask() {
//timer task
private DecimalFormat deciFormat = new DecimalFormat("0.00");
public void run() {
if (counter >100){
//Stop timer
messageTimer.cancel();
messageTimer.purge();
this.setVisible(false); //hide message
this.setOpacity(1); //set initial opacity to 1
return;
}else {
double opacity = Double.valueOf(deciFormat.format((1.0 - counter/100.0))); //set opacity value
this.setOpacity(opacity); //set the opacity to the correct value
counter+=3;
}
}
}, countBy*100, countBy); //delay value, speed value
}
}
这显然行不通。
这是我第一次在一个文件中处理凌乱的代码(因此,我尝试将代码从版本1拉入一个新的“对象”,我可以在多个类中使用它):
import javafx.scene.control.Label;
import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;
import java.io.IOException;
import java.sql.SQLException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Window;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
public class PrimaryController {
...
@FXML
private Label messageLabel;
private int counter;
private Timer messageTimer;
private void showMessage(boolean success, String message) {
//function to show message
/*
* To use: showMessage(false, "error"); or showMessage(true, "nice");
* Need:
* import javafx.scene.control.Label;
* import java.text.DecimalFormat;
* import java.util.Timer;
* import java.util.TimerTask;
*/
messageLabel.setVisible(true); //show message label
messageLabel.setOpacity(1); //set initial opacity to 1
messageLabel.setText(message); //set the message's text
if (success) {
messageLabel.setStyle("-fx-text-fill: #0bbf41");//set green
}else {
messageLabel.setStyle("-fx-text-fill: red");//set red
}
// Create new Timer
messageTimer = new Timer();
counter = 0; //should start from 0; do not change this value
//messageTimer.scheduleAtFixedRate(messageTask, 5, 5);
messageTimer.scheduleAtFixedRate(
new TimerTask() {
//timer task
private DecimalFormat deciFormat = new DecimalFormat("0.00");
public void run() {
if (counter >100){
//Stop timer
messageTimer.cancel();
messageTimer.purge();
messageLabel.setVisible(false); //hide message
messageLabel.setOpacity(1); //set initial opacity to 1
return;
}else {
double opacity = Double.valueOf(deciFormat.format((1.0 - counter/100.0))); //set opacity value
messageLabel.setOpacity(opacity); //set the opacity to the correct value
counter+=3;
}
}
}, 300, 4); //delay value, speed value
}
...
@FXML
void logInOnClick() throws IOException, SQLException {
...
if (userName.getText().isEmpty()) {
showMessage(false, "error in adsadsasdasdadsdasasd");
//showAlert(Alert.AlertType.ERROR, owner, "Form Error!","Please enter your email id");
return;
}
}
}
如果您有任何建议或帮助,我们将不胜感激,谢谢。
尝试使用FadeTransition。下面的示例应用程序。该应用程序需要三秒才能从1变为0透明度。
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* @author rstein
*/
public class App extends Application {
@Override
public void start(final Stage primaryStage) {
Label label = new Label("Label");
FadeTransition ft = new FadeTransition(Duration.millis(3000), label);
ft.setFromValue(1.0);
ft.setToValue(0);
ft.setCycleCount(1);
ft.play();
VBox root = new VBox(label);
Scene scene = new Scene(root, 300, 200);
primaryStage.setTitle(this.getClass().getSimpleName());
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(final String[] args) {
Application.launch(args);
}
}
问题内容: 我正在尝试在javaFX中创建自定义光标。这是我的代码: Windows 8.1的游标创建无效吗? 问题答案: 检出ImageCursor.getBestSize()方法和ImageCursor.getMaximumColors()并查看它们返回的内容,然后尝试匹配最佳大小和最大颜色的自定义光标图像。对于Windows 8.1,这很可能是32x32的光标。 这是来自javadoc 的引
问题内容: 我有简单的日期选择器代码,它可以禁用所有比选定日期更早的日期,但是我还需要能够禁用其他日期(例如:2014年10月17日至2014年10月19日)。以也禁用特定日期的方式更改它吗? 公共类DatePickerSample扩展了Application { } 问题答案: 如果要禁用多个日期范围,则可以创建以下POJO: 现在,您可以定义要在日历中禁用的范围的集合。例如: 最后,您只需要检
我正在尝试为JavaFX创建一个非常简单的自定义。运行应用程序时,
我想问一下在JavaFX中使用自定义对象创建ListView的最佳方法,我想要一个列表,每个项目如下所示: 我搜索发现大多数人都是用细胞工厂的方法来做的。还有别的办法吗?例如,使用custome fxml? 这是我的fmxl档案 这是我的对象任务: 我想让物品看起来像单个容器,但我没有找到任何方法。关于使用什么有什么建议吗?最好的方法是什么?
我使用listview作为排行榜,并显示球员的名字和总得分,这是通过字符串完成的。但是我想定制listview,这样它就包括位置和平均得分。我在下面提供了一个素描,说明我希望它是怎样的。 现在,我正在将一个纯字符串添加到可观察列表中,并在listview上查看它,但很难自定义它。我不知道该怎么做,最好的方法是什么?使用css还是JavaFX?关于listview,我确实有一些问题,比如是否可以有一
这似乎是一种非常“愚蠢”的方式...有人知道更好的方法吗?也许java有一些内置的方法?