① javafx計算器的問題,我想知道那個顯示框是用什麼方法,我用textfield的話好像會影響我的
importjavafx.application.Application;
importjavafx.geometry.Insets;
importjavafx.geometry.Pos;
importjavafx.scene.Scene;
importjavafx.scene.control.Button;
importjavafx.scene.control.TextField;
importjavafx.scene.layout.GridPane;
importjavafx.scene.text.Font;
importjavafx.scene.text.FontWeight;
importjavafx.stage.Stage;
{
privatestaticfinalStringstr="123+456-789×C0.÷";
publicstaticvoidmain(String[]args){
launch(args);
}
@Override
publicvoidstart(StageprimaryStage)throwsException{
GridPaneroot=newGridPane();
root.setAlignment(Pos.CENTER);
root.setPadding(newInsets(15));
root.setHgap(10);
root.setVgap(10);
Scenescene=newScene(root,300,350);
TextFieldtf=newTextField();
tf.setPrefHeight(50);//設置文本框的最佳高度為50
tf.setFont(Font.font(java.awt.Font.MONOSPACED,FontWeight.BOLD,18));//字體設置
root.add(tf,0,0,3,1);//跨三列,跨一行
Buttonbtn1=newButton("=");
btn1.setPrefSize(50,50);//設置按鈕的最佳寬高
root.add(btn1,3,0);
for(inti=0;i<str.length();i++){
Buttonbtn=newButton(str.charAt(i)+"");
btn.setPrefSize(50,50);
root.add(btn,i%4,i/4+1);//計算出列和行,並添加到GridPane上去
}
primaryStage.setScene(scene);
primaryStage.setTitle("Calculator");
primaryStage.show();
}
}
② JavaFXGridPane間隔可以設置顏色嗎
GridPane通常用於布局:第一列上的只讀標簽的輸入表單和第二列上的輸入欄位。
GridPane可以在行,列或單元格級別指定約束。
例如,我們可以設置包含輸入文本欄位的第二列,以在窗口調整大小時調整大小。
示例
以下代碼演示使用GridPane布局的簡單表單應用程序。它有以下布局。
+------------------------+
| [label ] [ field ] |
| [label ] [ field ] |
| [ button ] |
+------------------------+
Java
完整的代碼實現如下所示 -
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage primaryStage) {
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 380, 150, Color.WHITE);
// @ w WW .yII b a I .c O m
GridPane gridpane = new GridPane();
gridpane.setPadding(new Insets(5));
gridpane.setHgap(5);
gridpane.setVgap(5);
ColumnConstraints column1 = new ColumnConstraints(100);
ColumnConstraints column2 = new ColumnConstraints(50, 150, 300);
column2.setHgrow(Priority.ALWAYS);
gridpane.getColumnConstraints().addAll(column1, column2);
Label fNameLbl = new Label("First Name");
TextField fNameFld = new TextField();
Label lNameLbl = new Label("Last Name");
TextField lNameFld = new TextField();
Button saveButt = new Button("Save");
// First name label
GridPane.setHalignment(fNameLbl, HPos.RIGHT);
gridpane.add(fNameLbl, 0, 0);
// Last name label
GridPane.setHalignment(lNameLbl, HPos.RIGHT);
gridpane.add(lNameLbl, 0, 1);
// First name field
GridPane.setHalignment(fNameFld, HPos.LEFT);
gridpane.add(fNameFld, 1, 0);
// Last name field
GridPane.setHalignment(lNameFld, HPos.LEFT);
gridpane.add(lNameFld, 1, 1);
// Save button
GridPane.setHalignment(saveButt, HPos.RIGHT);
gridpane.add(saveButt, 1, 2);
root.setCenter(gridpane);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Java
上面的代碼生成以下結果。
示例2
以下是一個實現登錄窗口的代碼 -
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("JavaFX Welcome");
GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(25, 25, 25, 25));
Text scenetitle = new Text("Welcome");
scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
grid.add(scenetitle, 0, 0, 2, 1);
Label userName = new Label("User Name:");
grid.add(userName, 0, 1);
TextField userTextField = new TextField();
grid.add(userTextField, 1, 1);
Label pw = new Label("Password:");
grid.add(pw, 0, 2);
PasswordField pwBox = new PasswordField();
grid.add(pwBox, 1, 2);
Button btn = new Button("Sign in");
HBox hbBtn = new HBox(10);
hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
hbBtn.getChildren().add(btn);
grid.add(hbBtn, 1, 4);
final Text actiontarget = new Text();
grid.add(actiontarget, 1, 6);
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
actiontarget.setFill(Color.FIREBRICK);
actiontarget.setText("Sign in button pressed");
}
});
Scene scene = new Scene(grid, 300, 275);
primaryStage.setScene(scene);
primaryStage.show();
}
}
③ 如何把fxml文件和java代碼編寫的事件控制器相關聯
現在創建控制器來管理按鈕事件。本例演示如何把FXML和Java代碼編寫的事件控制器相關聯。
在Projects窗口,右擊 Sample.java,選擇 Refactor-- Rename .
輸入FXMLExampleController後點擊Refactor .
打開FXMLExampleController.java刪除代碼,用下面的代替 Example
9 .
Example 9
FXMLExampleController.java
package fxmlexample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
public class FXMLExampleController {
@FXML private Label buttonStatusText;
@FXML protected void handleSubmitButtonAction(ActionEvent event) {
buttonStatusText.setText("Submit button pressed");
}
@FXML protected void handlePasswordFieldAction(ActionEvent event) {
buttonStatusText.setText("Enter key pressed");
}
}
@FXML註解用來標識非公開控制器成員和方法。
作為Java的補充,也可以使用其他編譯型語言如Scala來實現控制器。.
現在可以運行了。輸入內容點擊Submit試試。
想要完整代碼,請下載 FXMLExample.zip .
使用腳本語言
除了使用Java創建控制器,可以使用任何提供jsR223-可編譯腳本引擎的語言。比如 JavaScript,
Groovy, Jython, 還有Clojure.下面是用 JavaScript編碼FXML的。
在fxml_example.fxml文件中,添加JavaScript聲明到XML聲明後。
<?language javascript?>
在 Button標記中,改變方法名稱
:
onAction="handleSubmitButtonAction(event);"
更新標記PasswordField :
onAction="handlePasswordFieldAction(event);"
移除fx:controller 從 BorderPane標記中,在
<script>中添加js方法 ,見Example
10 .
Example 10 JavaScript in FXML
<BorderPane xmlns:fx="http://javafx.com/fxml">
<fx:script>
function handleSubmitButtonAction() {
buttonStatusText.setText("Calling the JavaScript");
}
function handlePasswordFieldAction(event) {
buttonStatusText.text = "More JavaScript";
}
</fx:script>
當然也可以把js方法寫進外部文件 (比如 fxml_example.js)然後像下面這樣引用:
<fx:script source="fxml_example.js"/>
使用腳本編寫FXML,調試時可能不會步入函數體。
使用樣式表
使用內聯樣式,也可以添加樣式表然後為結點設置關聯。下面創建了樣式表來定義網格布局和標簽控制項的樣式。
創建樣式表.
在Projects窗口,右擊fxmlexample文件夾,選擇New -- Other .
在 New File對話框中,選擇Other -- Cascading Style Sheet , 然後 Next .
輸入 fxmlstylesheet後點擊Finish .
用下面的代碼代替原來的代碼 Example
11 .
Example 11 Contents of Style
Sheet
@charset "utf-8";
/*
Document : FXMLstylesheet.css
*/
.grid-pane {
-fx-padding: 80 0 0 0;
}
.label {
-fx-font: normal 36px Tahoma;
}
打開 FXMLExample.java,把樣式表加入到下面代碼前面 s tage.show() .scene.getStylesheets().add("fxmlexample/fxmlstylesheet.css");
打開 fxml_example.fxml添加樣式類.
為<String>元素添加導入語句。
<?import java.lang.*?>
用下面代碼代替GridPane Example
12 .
Example 12 Style Class for Grid
Pane
<GridPane alignment="top_center" hgap="8" vgap="8">
<styleClass>
<String fx:value="grid-pane"/>
</styleClass>
用下面代碼代替"Sign In" Label 。 Example
13 .
Example 13 Style class for
Label
<Label text="%signIn"
GridPane.columnIndex="0" GridPane.rowIndex="0">
<styleClass>
<String fx:value="label"/>
</styleClass>
</Label>
使用<styleClass>
標簽時,風格會應用到所有的類,除非它有自己的內聯風格。所以Example
13 中的更改不僅應用到了 Sign
In標簽,也賦予了Username 和Password標簽。但不會應用到Login Example標簽,因為它有自己的內聯樣式,覆蓋了其他風格。
④ javafx里的gridpane怎麼給定行和列來刪除一個節點
GridPane 類有用於 GridPane 布局的靜態 setHgrow() 和 setVgrow() 方法。 靜態 setHgrow() 方法傳遞 Priority.ALWAYS 參數意味著我們希望該節點佔用所有可用的水平空間,並與水平增長限制為 ALWAYS 的其他節點共享此空間。
⑤ 用分治法求解Tromino謎題
import java.lang.Math;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class termino extends Application {
public static void main(String[] args) {
launch(args);
}
GridPane pane = new GridPane();
static ArrayList<Integer> list = new ArrayList<>();
TextField ktf = new TextField();
TextField xtf = new TextField();
TextField ytf = new TextField();
Button qrbutton = new Button("確認");
static int c=1;
int i=0;
int t=1;
static int [][] a= new int[100][100];
@Override
public void start(Stage primaryStage)
{
pane.add(getHBox(),0,0);
qrbutton.setOnAction(e->run());
Scene scene = new Scene(pane);
primaryStage.setTitle("termino");
primaryStage.setScene(scene);
primaryStage.show();
}
void run()
{
pane.getChildren().clear();
int dr = Integer.parseInt(xtf.getText());
int dc = Integer.parseInt(ytf.getText());
int s = Integer.parseInt(ktf.getText());
Tromino(0,0,dr,dc,(int)Math.pow(2,s));
for(int t = 0; t <(int)Math.pow(2,s) ; t++)
{
for (int j = 0; j <(int)Math.pow(2,s); j++)
System.out.printf("%-3d ", a[t][j]);
System.out.print("\n");
}
System.out.print("\n");
for(int j=0;j<list.size();j+=2)
{
Rectangle r = new Rectangle(30,30);
r.setFill(Color.GRAY);
pane.add(r,list.get(j+1),list.get(j));
}
for(int j=0;j<list.size();j++)
{
System.out.println(list.get(j));
}
Button button = new Button("下一步");
pane.add(button, list.size(), list.size());
button.setOnMouseClicked(e->{
i=0;
for(i=0;i<list.size();i+=2)
{
if(a[list.get(i)][list.get(i+1)]==t)
{
Rectangle r1 = new Rectangle(30,30);
r1.setFill(Color.RED);
pane.add(r1,list.get(i+1),list.get(i));
}
}
t++;
});
}
static void Tromino(int tr, int tc, int dr, int dc, int size)
{
if (size == 1)
return;
int t = c++;
int s = size/2;
//左上角
if (dr < tr + s&&dc < tc + s)
Tromino(tr, tc, dr, dc, s);
else
{
a[tr + s - 1][tc + s - 1] = t;
list.add(tr+s-1);
list.add(tc+s-1);
Tromino(tr, tc, tr + s - 1, tc + s - 1, s);
}
//右上角
if (dr < tr + s&&dc >= tc + s)
Tromino(tr, tc + s, dr, dc, s);
else
{
a[tr + s - 1][tc + s] = t;
list.add(tr+s-1);
list.add(tc+s);
Tromino(tr, tc + s, tr + s - 1, tc + s, s);
}
//左下角
if (dr >= tr + s&&dc < tc + s)
Tromino(tr + s, tc, dr, dc, s);
else
{
a[tr + s][tc + s - 1] = t;
list.add(tr+s);
list.add(tc+s-1);
Tromino(tr + s, tc, tr + s, tc + s - 1, s);
}
//右下角
if (dr >= tr + s&&dc >= tc + s)
Tromino(tr + s, tc + s, dr, dc, s);
else
{
a[tr + s][tc + s] = t;
list.add(tr+s);
list.add(tc+s);
Tromino(tr + s, tc + s, tr + s, tc + s, s);
}
}
private HBox getHBox()
{
HBox hbox= new HBox(10);
hbox.setPadding(new Insets(15,15,15,15));
hbox.setStyle("-fx-background-color:gold");
hbox.getChildren().add(new Label("輸入行數"));
hbox.getChildren().add(ktf);
hbox.getChildren().add(new Label("輸入空位置行數"));
hbox.getChildren().add(xtf);
hbox.getChildren().add(new Label("輸入空位置列數"));
hbox.getChildren().add(ytf);
hbox.getChildren().add(qrbutton);
return hbox;
}
}
⑥ javafx窗體面板位置
點擊 ImageView 調整窗口。
Javafx幾種典型的布局是FlowPane面板它採用的布局策略是,按照控制項的添加次序按個擺放,按照從上到下,從左到右的次序擺放,當窗口的大小發生變化後,場景的大小也自動跟著變化,面板的大小也跟著變化,並且會重新計算各個控制項的位置,重新擺放各個控制項的位置,GridPane面板陪弊它採用的布局策略雹讓是,將整個面板劃分為若干個格子,每個格子的大小是一樣的,每個格子中可以放置一個控制項源亂局,類似於表格的方式。
⑦ 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();
}
}
-------------效果如下----------------
⑧ 在GridPane怎麼添加TextField和Label
我也遇到了這個問題,然後我顯式地寫了
importjavafx.scene.control.Button;
importjavafx.scene.control.TextField;
importjavafx.scene.control.Label;
就不報錯了
⑨ javafx 如何讓ComboBox鋪滿GridPane的整列
試試GridPane的這個方法:
public static void setHgrow(Node child,
Priority value)
Sets the horizontal grow priority for the child when contained by a gridpane.
If set, the gridpane will use the priority to allocate the child additional
horizontal space if the gridpane is resized larger than it's preferred width.
Setting the value to null will remove the constraint.
Parameters:
child - the child of a gridpane
value - the horizontal grow priority for the child
⑩ 求大佬幫幫忙用java寫這樣一個界面。