1. javaFX怎么把两个不同的pane加到一个scene中
这种要并排放置的情况就把一个HBox对象设为Scene的root,然后再把两个panel放到HBox上即可。由于你只是要界面,计算器的计算逻辑我就不实现了,具体代码如下(运行环境:jdk8或以上):
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
public class TwoPane extends Application {
final static private int BUTTON_WIDTH = 40;
final static private int BUTTON_HEIGHT = 40;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("简易计算器");
Label label = new Label("");
label.setAlignment(Pos.CENTER);
label.setMinWidth(100);
HBox expresssionPanel = new HBox(label);
expresssionPanel.setAlignment(Pos.CENTER);
GridPane keyboardPanel = new GridPane();
for(int i = 1; i <= 9; ++i){
Button btn = new Button(String.valueOf(i));
btn.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
btn.setOnAction(e -> label.setText(label.getText() + btn.getText()));
keyboardPanel.add(btn, (i - 1) % 3, i > 3 ? (i > 6 ? 2 : 1) : 0);
}
Button zero = new Button(String.valueOf("0"));
zero.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
zero.setOnAction(e -> label.setText(label.getText() + zero.getText()));
Button plus = new Button(String.valueOf("+"));
plus.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
plus.setOnAction(e -> label.setText(label.getText() + plus.getText()));
Button minus = new Button(String.valueOf("-"));
minus.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
minus.setOnAction(e -> label.setText(label.getText() + minus.getText()));
Button time = new Button(String.valueOf("*"));
time.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
time.setOnAction(e -> label.setText(label.getText() + time.getText()));
Button divide = new Button(String.valueOf("/"));
divide.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
divide.setOnAction(e -> label.setText(label.getText() + divide.getText()));
Button calc = new Button(String.valueOf("="));
calc.setPrefSize(BUTTON_WIDTH, BUTTON_HEIGHT);
calc.setOnAction(e -> label.setText(label.getText() + calc.getText())/*TODO 计算逻辑代码待完成*/);
keyboardPanel.add(zero, 0, 3);
keyboardPanel.add(plus, 1, 3);
keyboardPanel.add(minus, 2, 3);
keyboardPanel.add(time, 0, 4);
keyboardPanel.add(divide, 1, 4);
keyboardPanel.add(calc, 2, 4);
HBox root = new HBox(expresssionPanel, keyboardPanel);
HBox.setHgrow(expresssionPanel, Priority.ALWAYS);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
-------------效果如下----------------
2. javafx怎么给tabpane添加样式
javafx怎么耐孙给tabpane添加样昌好链袜档式
Tab tab = ...;
tab.setGraphic(new ImageView(...));
or
Tab tab = TabBuilder.create().graphic(new ImageView(...)).build();
3. javafx 用GraphicsContext如何画虚线
Lineline1=newLine(20,40,270,40);
line1.getStrokeDashArray().addAll(25d,20d,5d,20d);
Lineline2=newLine(20,60,270,60);
line2.getStrokeDashArray().addAll(50d,40d);
Lineline3=newLine(20,80,270,80);
line3.getStrokeDashArray().addAll(25d,10d);
Lineline4=newLine(20,100,270,100);
line4.getStrokeDashArray().addAll(2d);
Lineline5=newLine(20,120,270,120);
line5.getStrokeDashArray().addAll(2d,21d);
pane.getChildren().addAll(line1,line2,line3,line4,line5);
4. javafx中如何给面板添加背景图片例如BorderPane
用指定的图片构造标签对象lb。
把标签放在第二层JlayerPane上。
设置标签的尺回寸,即背景图象的大小答。
把内容面板设置为透明,这样整个框架的背景就不再是内容面板的背景色,而是第二层中标签的图像。
将标签添加到主面板pnlMain中。
5. 初学了一段时间Java。想做一个应用程序,程序只需要播放一个本地视频,MP4格式,求教怎么做
使用javafx的Media,MediaPlayer,MediaView。代码如下:
importjava.io.File;
importjavafx.application.Application;
importjavafx.beans.binding.Bindings;
importjavafx.beans.property.ReadOnlyProperty;
importjavafx.beans.value.ObservableValue;
importjavafx.event.ActionEvent;
importjavafx.geometry.Pos;
importjavafx.scene.Scene;
importjavafx.scene.control.Button;
importjavafx.scene.control.Menu;
importjavafx.scene.control.MenuBar;
importjavafx.scene.control.MenuItem;
importjavafx.scene.control.Slider;
importjavafx.scene.image.Image;
importjavafx.scene.image.ImageView;
importjavafx.scene.layout.BorderPane;
importjavafx.scene.layout.HBox;
importjavafx.scene.layout.Pane;
importjavafx.scene.layout.VBox;
importjavafx.scene.media.Media;
importjavafx.scene.media.MediaPlayer;
importjavafx.scene.media.MediaPlayer.Status;
importjavafx.scene.media.MediaView;
importjavafx.stage.FileChooser;
importjavafx.stage.FileChooser.ExtensionFilter;
importjavafx.stage.Stage;
importjavafx.util.Duration;
{
privateMediaViewmediaView;
privateSliderprocessSlider;
privatestaticfinalObjectAUTO=newObject(),MANUAL=newObject();
publicstaticvoidmain(String[]args){
launch(args);
}
@Override
publicvoidstart(StageprimaryStage)throwsException{
primaryStage.setTitle("javafx视频播放器");
BorderPaneroot=newBorderPane();
//菜单栏
initMenu(root);
//视频播放控件
mediaView=initMediaView(root);
//视频功能控件
initMediaControllView(root);
primaryStage.setScene(newScene(root,600,400));
primaryStage.setOnCloseRequest(event->System.exit(0));
primaryStage.show();
}
privateMenuBarinitMenu(finalBorderPaneparent){
Menumenu=newMenu("菜单");
MenuItemitem=newMenuItem("打开");
item.setOnAction(event->{
FileChooserchooser=newFileChooser();
chooser.setTitle("选择视频文件");
chooser.getExtensionFilters().add(newExtensionFilter("视频文件","*.mp4","*.flv"));
Filefile=chooser.showOpenDialog(parent.getScene().getWindow());
if(file!=null){
MediaPlayerplayer=mediaView.getMediaPlayer();
//关闭当前的player
if(player!=null){
player.stop();
player.dispose();
}
processSlider.setValue(0);
//创建一个新的player并自动播放
player=newMediaPlayer(newMedia(file.toURI().toString()));
player.currentTimeProperty().addListener(this::mediaProcessChanged);
player.setAutoPlay(true);
mediaView.setMediaPlayer(player);
}
});
menu.getItems().add(item);
item=newMenuItem("退出");
item.setOnAction(event->parent.getScene().getWindow().hide());
menu.getItems().add(item);
MenuBarmenuBar=newMenuBar(menu);
parent.setTop(menuBar);
returnmenuBar;
}
privateMediaViewinitMediaView(finalBorderPaneparent){
MediaViewview=newMediaView();
Panepane=newPane(view);
parent.setCenter(pane);
//视频宽高可随着窗口变化而自动缩放
view.fitWidthProperty().bind(Bindings.selectDouble(view.parentProperty(),"width"));
view.fitHeightProperty().bind(Bindings.selectDouble(view.parentProperty(),"height"));
view.setPreserveRatio(true);
returnview;
}
(finalBorderPaneparent){
VBoxbottom=newVBox(10);
bottom.setAlignment(Pos.CENTER);
parent.setBottom(bottom);
Sliderslider=newSlider(0,100,0);
slider.valueProperty().addListener(this::processSliderChanged);
// slider.setOnMouseClicked(this::processSliderClicked);
bottom.getChildren().add(slider);
processSlider=slider;
HBoxhbox=newHBox(10);
bottom.getChildren().add(hbox);
hbox.setAlignment(Pos.CENTER);
Buttonbtn=newButton(null,newImageView(loadImage("pause.png")));
btn.setOnAction(this::pauseOrPlay);
hbox.getChildren().add(btn);
btn=newButton(null,newImageView(loadImage("stop.png")));
btn.setOnAction(this::stopPlay);
hbox.getChildren().add(btn);
}
privatestaticImageloadImage(StringresPath){
returnnewImage(Thread.currentThread().getContextClassLoader().getResourceAsStream(resPath));
}
privatevoidpauseOrPlay(ActionEventevent){
MediaPlayerplayer=mediaView.getMediaPlayer();
if(player==null){
return;
}
Statusstatus=player.getStatus();
if(status==Status.READY||status==Status.PAUSED){
player.play();
((Button)event.getTarget()).setGraphic(newImageView(loadImage("pause.png")));
}elseif(status==Status.PLAYING){
player.pause();
((Button)event.getTarget()).setGraphic(newImageView(loadImage("play.png")));
}
}
privatevoidstopPlay(ActionEventevent){
MediaPlayerplayer=mediaView.getMediaPlayer();
if(player==null){
return;
}
player.stop();
}
// (MouseEventevent){
// Sliderslider=(Slider)event.getSource();
// if(mediaView.getMediaPlayer()!=null){
// Durationd=mediaView.getMediaPlayer().getTotalDuration().multiply(slider.getValue()/slider.getMax());
// mediaView.getMediaPlayer().seek(d);
// }
// }
(ObservableValue<?extendsNumber>observable,NumberoldValue,NumbernewValue){
Sliderslider=(Slider)((ReadOnlyProperty<?extendsNumber>)observable).getBean();
if(slider.getUserData()==AUTO){//进度条是自动改变的,因此不用设置播放器
slider.setUserData(null);
return;
}
if(mediaView.getMediaPlayer()!=null){
slider.setUserData(MANUAL);
Durationd=mediaView.getMediaPlayer().getTotalDuration().multiply(newValue.doubleValue()/slider.getMax());
mediaView.getMediaPlayer().seek(d);
}
}
(ObservableValue<?extendsDuration>observable,DurationoldValue,DurationnewValue){
if(processSlider.getUserData()==MANUAL){//手动点击进度条
processSlider.setUserData(null);
return;
}
MediaPlayerplayer=(MediaPlayer)((ReadOnlyProperty<?extendsDuration>)observable).getBean();
processSlider.setUserData(AUTO);
processSlider.setValue(newValue.toMillis()/player.getTotalDuration().toMillis()*100);
}
}
6. JavaFX 如何隐藏Pagination的按钮
以Pagination的按钮隐藏为例: 首先打开FX的CSS文档,了解Pagination的结构, 找到按钮等所在的子组件,然后让子组件隐藏即可;
FXCSS文档; Pagination的结构如下:
所以, 建议还是系统的学习下javaFX,比如fxcss (和HTML的CSS文件比较类似) 以及FXML(结构类似HTML) 稍微阅读下组件的源代码即可
7. 请问javafx该如何获取一个组件的全局绝对坐标目前我想让组件随着鼠标的拖动而改变位置,(接下面)
效果如图
鼠标拖动效果
参考代码如下
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.stage.Stage;
public class TestDraggedApp extends Application {
//保存鼠标点击在组件上的位置
private double offsetX,offsetY;
@Override
public void start(Stage primaryStage) {
Pane root = new Pane();
Region region = new Region();
region.setStyle("-fx-background-color: #75c0ff;-fx-pref-width: 100;-fx-pref-height: 50");
root.getChildren().add(region);
primaryStage.setScene(new Scene(root, 500, 320));
primaryStage.setTitle("TestDraggedApp");
primaryStage.show();
//设置鼠标按下事件
region.setOnMousePressed(event -> {
//记录鼠标点击在组件上的位置
offsetX = event.getX();
offsetY = event.getY();
});
//设置鼠标拖动事件
region.setOnMouseDragged(event -> {
//设置新的位置
double layoutX = event.getSceneX() - offsetX;
region.setLayoutX(layoutX);
double layoutY = event.getSceneY() - offsetY;
region.setLayoutY(layoutY);
});
}
public static void main(String[] args) {
launch(args);
}
}
8. JavaFX界面半透明遮盖怎么整
stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL);
stage.initStyle(StageStyle.TRANSPARENT);//这是让弹出窗口透明棚散轿,如果不设置stage透明,stackpane再怎么设置也没用。
FXML:
<StackPane
style="-fx-border-radius:8px;-fx-opacity: 0.4;-fx-background-color: black ;"
xmlns="Java SE | Oracle Technology Network" xmlns:fx="Java SE | Oracle Technology Network"
>
fxml里用css样式 -fx-opacity: 0.4;控制stackpane半透明
以上方法stage显示后是半透明遮罩效果,但是我想要在链肆stackpane中间一块区域里放输入对话框,结果输入掘斗部分还是半透明的效果,还未能解决
追加----换了下实现方式,就是在primaryStage布局中用stackpane,在stackpane的children中添加一个半透明的pane,<Pane fx:id="main_mask" style="-fx-border-radius:8px;-fx-opacity: 0.4;-fx-background-color: black ;" visible="false" />,默认不显示;在显示弹出的stage时,再通过代码设置main_mask显示,在关闭弹出stage时,隐藏main_mask,这样能达到想要的效果了,但是这样的缺点是不通用,组件不独立,想办法改进中
9. javafx界面编程问题
效果图
importjavafx.application.Application;
importjavafx.scene.Scene;
importjavafx.scene.layout.Pane;
importjavafx.scene.paint.Color;
importjavafx.scene.text.Text;
importjavafx.stage.Stage;
{
publicstaticvoidmain(String[]args){
launch(args);
}
finalstaticStringWZ="位置:";
@Override
publicvoidstart(StageprimaryStage)throwsException{
Panepane=newPane();//Pane布局类似于绝对布局,一般需要为里面指键陵的组件提供一个位置
Texttext=newText(WZ+"未知,未知");
text.setFill(Color.RED);//文字颜色设置为红色
//设置text的位置,在默认位置的基础上,右移100,下移100
//text.setTranslateX(100);//如果没有指定text的位置,那么text默认会在窗口左上角的里面,不能显示出来
//text.setTranslateY(100);
pane.getChildren().addAll(text);
Scenescene=newScene(pane,300,300,Color.ALICEBLUE);
primaryStage.setScene(scene);
primaryStage.setTitle("点击测试");
primaryStage.show();
//给场景添加鼠标点击事件,
scene.setOnMouseClicked(e->{
text.setTranslateX(e.getSceneX());
text.setTranslateY(e.getSceneY());
text.setText(WZ+e.getSceneX()+","+e.getSceneY());//点击时获取鼠标在场景上的位置
});
}
}