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());//點擊時獲取滑鼠在場景上的位置
});
}
}