所以我用Java创建了一个端口扫描程序。
使用Swing时,一切顺利,0错误。
但是我尝试将我的应用程序转换为JavaFX样式的GUI,当我按下按钮时没有任何作用(即使我在GUI构建器中设置了方法ID)。
什么似乎是我的问题?
我的代码:
package networkTools.gui;
import java.net.Socket;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
public class PortScannerController implements Initializable {
@FXML
TextField hostName;
@FXML
TextField fromPort;
@FXML
TextArea log;
@FXML
Button scan;
@FXML
Button reset;
@FXML
Label label;
@Override
public void initialize(URL url, ResourceBundle rb) {
hostName.requestFocus();
}
public void initFocus() {
hostName.requestFocus();
}
@FXML
private void onScan() {
int fp;
String h;
Socket s;
if (hostName.getText().equals("")) {
log.setText("Fill everything correct.");
return;
} else if (fromPort.getText().equals("")) {
log.setText("Fill everything correct..");
return;
} else if (!fromPort.getText().matches("[0-9]*")) {
log.setText("Give a number for a port ");
return;
}
// scan.disable(false);
reset.setText("Stop");
log.setText("");
log.clear();
label.setText("");
h = hostName.getText();
fp = Integer.parseInt(fromPort.getText());
label.setText("Port " + fp + " being tested (max +- 15 sec.)");
try {
s = new Socket(h, fp);
log.appendText("Poort " + fp + " is open.\n");
log.clear();
s.close();
} catch (Exception er) {
log.appendText("Poort " + fp + " is closed");
}
// scan.setEnabled(true);
reset.setText("Reset");
label.setText("Press scan to start.");
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<VBox id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="400.0" stylesheets="@style.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="networkTools.gui.PortScannerController">
<children>
<StackPane prefHeight="80.0" prefWidth="600.0">
<children>
<Label id="title" alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="50.0" prefWidth="400.0" text="Port Scanner" StackPane.alignment="CENTER">
<font>
<Font name="Arial Black" size="18.0" />
</font>
</Label>
</children>
</StackPane>
<GridPane>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="295.0" minWidth="10.0" prefWidth="131.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="407.0" minWidth="10.0" prefWidth="269.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints maxHeight="50.0" minHeight="50.0" prefHeight="50.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="50.0" minHeight="50.0" prefHeight="50.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="50.0" minHeight="50.0" prefHeight="50.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="100.0" text="Host Name">
<font>
<Font name="Arial Black" size="12.0" />
</font>
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Label>
<Label alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="100.0" text="Port" GridPane.rowIndex="1">
<font>
<Font name="Arial Black" size="12.0" />
</font>
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin>
</Label>
<TextField fx:id="fromPort" GridPane.columnIndex="1" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
<font>
<Font name="Arial Black" size="12.0" />
</font>
</TextField>
<ToggleButton id="commandbutton" fx:id="onScan" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" prefHeight="25.0" prefWidth="100.0" text="Scan" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER">
<font>
<Font name="Arial Black" size="12.0" />
</font>
</ToggleButton>
<ToggleButton id="commandbutton" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" prefHeight="25.0" prefWidth="100.0" text="Reset" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER">
<font>
<Font name="Arial Black" size="12.0" />
</font>
</ToggleButton>
<TextField fx:id="hostName" GridPane.columnIndex="1">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
<font>
<Font name="Arial Black" size="12.0" />
</font>
</TextField>
</children>
</GridPane>
<TextArea id="textpane" fx:id="log" editable="false" prefHeight="148.0" prefWidth="600.0">
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</TextArea>
<StackPane prefHeight="80.0" prefWidth="380.0" VBox.vgrow="NEVER">
<VBox.margin>
<Insets bottom="10.0" left="20.0" />
</VBox.margin>
<children>
<Label alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="200.0" text="Press Scan to start" textFill="#1815c9">
<font>
<Font name="Arial Black" size="13.0" />
</font>
</Label>
</children>
</StackPane>
</children>
</VBox>
答案 0 :(得分:2)
您无法将处理程序与按钮相关联。您需要FXML中的onAction="#onScan"
“扫描”按钮:
<ToggleButton id="commandbutton" onAction="#onScan" fx:id="onScan" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" prefHeight="25.0" prefWidth="100.0" text="Scan" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.valignment="CENTER">
在FXML中还有其他一些看起来不正确的事情:
"commandButton"
);如果要在多个组件之间共享样式,则应使用styleClass
而不是id
。 fx:id="onScan"
,但您的控制器中没有名为onScan
的字段。ToggleButton
而不是常规Button
来表示动作似乎并不十分清楚。 ToggleButton
通常用于在两种不同的状态之间切换,而不是发出命令/动作。