实现服务的配置与接口的增删改查

This commit is contained in:
peng
2021-10-27 20:02:55 +08:00
parent 136f8d62ac
commit 306664b3df
16 changed files with 686 additions and 41 deletions

View File

@@ -0,0 +1,22 @@
{
"projectName" : null,
"width" : 1200,
"height" : 800,
"serverConfigs" : [ {
"serverName" : "测试接口",
"port" : 8080,
"serverUrls" : [ {
"urlName" : "登出",
"url" : "/logout",
"requestType" : "GET",
"responseBody" : "{\n \"username\": \"admin\",\n \"password\": \"123\"\n}",
"headerMap" : null
}, {
"urlName" : "查询1",
"url" : "/list1",
"requestType" : null,
"responseBody" : "{\n\t\"taskNo\": \"123\"\n}",
"headerMap" : null
} ]
} ]
}

View File

@@ -2,30 +2,20 @@ package com.dayrain;
import com.dayrain.entity.Configuration;
import com.dayrain.entity.RequestType;
import com.dayrain.entity.Server;
import com.dayrain.entity.ServerConfig;
import com.dayrain.entity.ServerUrl;
import com.dayrain.utils.FileUtils;
import com.dayrain.views.HomePage;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.stage.Stage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ApplicationStarter extends Application {
Configuration configuration = configInit();
public static void main(String[] args) {
// List<ServerConfig> serverConfigs = configuration.getServerConfigs();
// for (ServerConfig serverConfig : serverConfigs) {
// Server server = new Server(serverConfig);
// Thread thread = new Thread(server);
// thread.start();
// }
launch(args);
}
@@ -40,7 +30,7 @@ public class ApplicationStarter extends Application {
" \"password\": \"123\"\n" +
"}"));
add(new ServerUrl("", "/logout", RequestType.GET, "{\n" +
add(new ServerUrl("", "/logout", RequestType.GET, "{\n" +
" \"username\": \"admin\",\n" +
" \"password\": \"123\"\n" +
"}"));
@@ -56,6 +46,6 @@ public class ApplicationStarter extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
new HomePage(primaryStage, configuration).start();
new HomePage(primaryStage).start();
}
}

View File

@@ -0,0 +1,18 @@
package com.dayrain.entity;
import com.dayrain.utils.FileUtils;
public class ConfigHolder {
private static Configuration configuration;
private ConfigHolder(){}
public synchronized static Configuration init() {
configuration = FileUtils.load();
return configuration;
}
public static void save() {
FileUtils.saveConfig(configuration);
}
}

View File

@@ -15,21 +15,36 @@ public class Server implements Runnable {
private final ServerConfig serverConfig;
private HttpServer httpServer;
public Server(ServerConfig serverConfig) {
this.serverConfig = serverConfig;
}
@Override
public void run() {
try {
HttpServer httpServer = HttpServer.create(new InetSocketAddress(serverConfig.getPort()), 0);
this.httpServer = HttpServer.create(new InetSocketAddress(serverConfig.getPort()), 0);
httpServer.setExecutor(Executors.newCachedThreadPool());
for (ServerUrl serverUrl : serverConfig.getServerUrls()) {
httpServer.createContext(serverUrl.getUrl(), new RequestHandler(serverUrl));
addContext(serverUrl);
}
httpServer.start();
System.out.println("" +serverConfig.getServerName() + "】服务已开启...");
} catch (IOException e) {
e.printStackTrace();
}
}
public void stop() {
if(httpServer != null) {
System.out.println("" + serverConfig.getServerName() + "】服务已关闭...");
httpServer.stop(0);
}
}
public void addContext(ServerUrl serverUrl) {
httpServer.createContext(serverUrl.getUrl(), new RequestHandler(serverUrl));
}
}

View File

@@ -16,6 +16,9 @@ public class ServerConfig {
*/
private List<ServerUrl>serverUrls;
public ServerConfig() {
}
public ServerConfig(String serverName, int port, List<ServerUrl>serverUrls) {
this.serverName = serverName;
this.port = port;

View File

@@ -26,11 +26,14 @@ public class ServerUrl {
*/
private Map<String, String> headerMap;
public ServerUrl(String urlName, String url, RequestType requestType, String requestBody) {
public ServerUrl() {
}
public ServerUrl(String urlName, String url, RequestType requestType, String responseBody) {
this.urlName = urlName;
this.url = url;
this.requestType = requestType;
this.responseBody = requestBody;
this.responseBody = responseBody;
}
public String getUrlName() {

View File

@@ -0,0 +1,112 @@
package com.dayrain.handle;
import com.dayrain.entity.ConfigHolder;
import com.dayrain.entity.ServerConfig;
import com.dayrain.entity.ServerUrl;
import com.dayrain.server.ServerThread;
import com.dayrain.utils.ListViewHelper;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.util.HashMap;
import java.util.List;
/**
* 添加路径
* @author peng
* @date 2021/10/27
*/
public class AddUrlHandler implements EventHandler<ActionEvent> {
private final ServerConfig serverConfig;
private final ListView<ServerUrl> serverUrlListView;
private final HashMap<String, ServerThread> threadMap;
private final Stage primaryStage;
public AddUrlHandler(ServerConfig serverConfig, ListView<ServerUrl> serverUrlListView, HashMap<String, ServerThread> threadMap, Stage primaryStage) {
this.serverConfig = serverConfig;
this.serverUrlListView = serverUrlListView;
this.threadMap = threadMap;
this.primaryStage = primaryStage;
}
@Override
public void handle(ActionEvent event) {
Stage stage = new Stage();
Label nameLabel = new Label("接口名称:");
nameLabel.setPrefWidth(80);
TextField nameField = new TextField();
Label urlLabel = new Label("接口地址:");
TextField urlField = new TextField();
urlField.setPrefWidth(80);
Label respLabel = new Label("返回结果:");
TextArea textArea = new TextArea();
textArea.setPrefWidth(80);
HBox btnHBox = new HBox();
Button saveButton = new Button("保存");
btnHBox.getChildren().add(saveButton);
btnHBox.setAlignment(Pos.CENTER_RIGHT);
GridPane gridPane = new GridPane();
gridPane.add(nameLabel, 0, 0);
gridPane.add(nameField, 1, 0);
gridPane.add(urlLabel, 0, 1);
gridPane.add(urlField, 1, 1);
gridPane.add(respLabel, 0, 2);
gridPane.add(textArea, 1, 2);
gridPane.add(btnHBox, 1, 3);
gridPane.setAlignment(Pos.CENTER);
gridPane.setHgap(20d);
gridPane.setVgap(10d);
stage.setWidth(500);
stage.setHeight(400);
stage.initOwner(primaryStage);
stage.initModality(Modality.WINDOW_MODAL);
stage.setScene(new Scene(gridPane));
stage.show();
saveButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
String name = nameField.getText();
List<ServerUrl> serverUrls = serverConfig.getServerUrls();
for (ServerUrl serverUrl : serverUrls) {
if(serverUrl.getUrlName().equals(name)) {
return;
}
}
String url = urlField.getText();
String resp = textArea.getText();
ServerUrl serverUrl = new ServerUrl(name, url, null, resp);
serverUrls.add(serverUrl);
ServerThread serverThread = threadMap.getOrDefault(serverConfig.getServerName(), null);
if(serverThread != null) {
serverThread.addContext(serverUrl);
}
ListViewHelper.addAndRefresh(serverUrl, serverUrlListView);
ConfigHolder.save();
stage.close();
}
});
}
}

View File

@@ -0,0 +1,44 @@
package com.dayrain.handle;
import com.dayrain.entity.ConfigHolder;
import com.dayrain.entity.ServerConfig;
import com.dayrain.entity.ServerUrl;
import com.dayrain.server.ServerThread;
import com.dayrain.utils.ListViewHelper;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ListView;
import java.util.HashMap;
import java.util.List;
/**
* 删除路径
* @author peng
* @date 2021/10/27
*/
public class DeleteUrlHandler implements EventHandler<ActionEvent> {
private final ServerConfig serverConfig;
private final ListView<ServerUrl> serverUrlListView;
private final HashMap<String, ServerThread> threadMap;
private final ServerUrl serverUrl;
public DeleteUrlHandler(ServerUrl serverUrl, ServerConfig serverConfig, ListView<ServerUrl> serverUrlListView, HashMap<String, ServerThread> threadMap) {
this.serverUrl = serverUrl;
this.serverConfig = serverConfig;
this.serverUrlListView = serverUrlListView;
this.threadMap = threadMap;
}
@Override
public void handle(ActionEvent event) {
List<ServerUrl> serverUrls = serverConfig.getServerUrls();
serverUrls.remove(serverUrl);
ConfigHolder.save();
ListViewHelper.deleteAndRefresh(serverUrl, serverUrlListView);
}
}

View File

@@ -0,0 +1,54 @@
package com.dayrain.handle;
import com.dayrain.entity.Server;
import com.dayrain.entity.ServerConfig;
import com.dayrain.server.ServerThread;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import java.util.HashMap;
/**
* 服务启动与关闭控制器
* @author peng
* @date 2021/10/27
*/
public class StartServerHandler implements EventHandler<ActionEvent> {
private final Button openButton;
private final Circle statusCircle;
private final ServerConfig serverConfig;
private final HashMap<String, ServerThread> threadMap;
public StartServerHandler(Button openButton, Circle statusCircle, ServerConfig serverConfig, HashMap<String, ServerThread> threadMap) {
this.openButton = openButton;
this.statusCircle = statusCircle;
this.serverConfig = serverConfig;
this.threadMap = threadMap;
}
@Override
public void handle(ActionEvent event) {
String serverName = serverConfig.getServerName();
if(threadMap.containsKey(serverName)) {
ServerThread serverThread = threadMap.get(serverName);
if(serverThread != null) {
serverThread.stopServer();
}
threadMap.remove(serverName);
openButton.setText("开启服务");
statusCircle.setFill(Color.RED);
}else {
ServerThread serverThread = new ServerThread(new Server(serverConfig));
serverThread.start();
threadMap.put(serverName, serverThread);
openButton.setText("关闭服务");
statusCircle.setFill(Color.GREEN);
}
}
}

View File

@@ -0,0 +1,77 @@
package com.dayrain.handle;
import com.dayrain.entity.ConfigHolder;
import com.dayrain.entity.ServerConfig;
import com.dayrain.utils.ListViewHelper;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
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.stage.Modality;
import javafx.stage.Stage;
public class UpdateServerConfigHandler implements EventHandler<ActionEvent> {
private final ServerConfig serverConfig;
private final Stage primaryStage;
public UpdateServerConfigHandler(ServerConfig serverConfig, Stage primaryStage) {
this.serverConfig = serverConfig;
this.primaryStage = primaryStage;
}
@Override
public void handle(ActionEvent event) {
Stage stage = new Stage();
Label serverName = new Label("服务名称:");
serverName.setPrefWidth(80);
TextField nameField = new TextField(serverConfig.getServerName());
Label portLabel = new Label("端口:");
TextField portField = new TextField(String.valueOf(serverConfig.getPort()));
portField.setPrefWidth(80);
HBox btnHBox = new HBox();
Label saveTips = new Label("重启后生效");
saveTips.setStyle("-fx-background-color: #ff0000");
Button saveButton = new Button("保存");
btnHBox.getChildren().addAll(saveTips, saveButton);
btnHBox.setAlignment(Pos.CENTER_RIGHT);
btnHBox.setSpacing(20d);
GridPane gridPane = new GridPane();
gridPane.add(serverName, 0, 0);
gridPane.add(nameField, 1, 0);
gridPane.add(portLabel, 0, 1);
gridPane.add(portField, 1, 1);
gridPane.add(btnHBox, 1, 3);
gridPane.setAlignment(Pos.CENTER);
gridPane.setHgap(20d);
gridPane.setVgap(10d);
stage.setWidth(400);
stage.setHeight(300);
stage.initOwner(primaryStage);
stage.initModality(Modality.WINDOW_MODAL);
stage.setScene(new Scene(gridPane));
stage.show();
saveButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
String name = nameField.getText();
int port = Integer.parseInt(portField.getText());
serverConfig.setPort(port);
serverConfig.setServerName(name);
ConfigHolder.save();
stage.close();
}
});
}
}

View File

@@ -0,0 +1,95 @@
package com.dayrain.handle;
import com.dayrain.entity.ConfigHolder;
import com.dayrain.entity.ServerConfig;
import com.dayrain.entity.ServerUrl;
import com.dayrain.server.ServerThread;
import com.dayrain.utils.ListViewHelper;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import java.util.HashMap;
public class UpdateUrlHandler implements EventHandler<ActionEvent> {
private final ListView<ServerUrl> serverUrlListView;
private final ServerUrl serverUrl;
private final Stage primaryStage;
public UpdateUrlHandler(ServerUrl serverUrl, ListView<ServerUrl> serverUrlListView, Stage primaryStage) {
this.serverUrl = serverUrl;
this.serverUrlListView = serverUrlListView;
this.primaryStage = primaryStage;
}
@Override
public void handle(ActionEvent event) {
Stage stage = new Stage();
Label nameLabel = new Label("接口名称:");
nameLabel.setPrefWidth(80);
TextField nameField = new TextField(serverUrl.getUrlName());
Label urlLabel = new Label("接口地址:");
TextField urlField = new TextField(serverUrl.getUrl());
urlField.setPrefWidth(80);
Label respLabel = new Label("返回结果:");
TextArea textArea = new TextArea(serverUrl.getResponseBody());
textArea.setPrefWidth(80);
HBox btnHBox = new HBox();
Label saveTips = new Label("重启后生效");
saveTips.setStyle("-fx-background-color: #ff0000");
Button saveButton = new Button("保存");
btnHBox.getChildren().addAll(saveTips, saveButton);
btnHBox.setAlignment(Pos.CENTER_RIGHT);
btnHBox.setSpacing(20d);
GridPane gridPane = new GridPane();
gridPane.add(nameLabel, 0, 0);
gridPane.add(nameField, 1, 0);
gridPane.add(urlLabel, 0, 1);
gridPane.add(urlField, 1, 1);
gridPane.add(respLabel, 0, 2);
gridPane.add(textArea, 1, 2);
gridPane.add(btnHBox, 1, 3);
gridPane.setAlignment(Pos.CENTER);
gridPane.setHgap(20d);
gridPane.setVgap(10d);
stage.setWidth(500);
stage.setHeight(400);
stage.initOwner(primaryStage);
stage.initModality(Modality.WINDOW_MODAL);
stage.setScene(new Scene(gridPane));
stage.show();
saveButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
String name = nameField.getText();
String url = urlField.getText();
String resp = textArea.getText();
serverUrl.setUrlName(name);
serverUrl.setUrl(url);
serverUrl.setResponseBody(resp);
ListViewHelper.refresh(serverUrlListView);
ConfigHolder.save();
stage.close();
}
});
}
}

View File

@@ -0,0 +1,21 @@
package com.dayrain.server;
import com.dayrain.entity.Server;
import com.dayrain.entity.ServerUrl;
public class ServerThread extends Thread {
private final Server server;
public ServerThread(Server server) {
super(server);
this.server = server;
}
public void stopServer() {
server.stop();
}
public void addContext(ServerUrl serverUrl) {
server.addContext(serverUrl);
}
}

View File

@@ -0,0 +1,59 @@
package com.dayrain.utils;
import com.dayrain.entity.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileUtils{
private static String configPath = Thread.currentThread().getContextClassLoader().getResource("resources/config.json").getFile();
public static void saveConfig(Configuration configuration){
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(configPath);
String config = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(configuration);
fileWriter.write(config);
fileWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fileWriter != null) {
fileWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Configuration load() {
BufferedReader bufferedReader = null;
try {
StringBuilder configStr = new StringBuilder();
bufferedReader = new BufferedReader(new FileReader(configPath));
String buf = null;
while ((buf = bufferedReader.readLine()) != null) {
configStr.append(buf);
}
return new ObjectMapper().readValue(configStr.toString(), Configuration.class);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}

View File

@@ -0,0 +1,24 @@
package com.dayrain.utils;
import com.dayrain.entity.ServerUrl;
import javafx.collections.ObservableList;
import javafx.scene.control.ListView;
public class ListViewHelper {
public static void addAndRefresh(ServerUrl serverUrl, ListView<ServerUrl>serverUrls) {
serverUrls.getItems().add(serverUrl);
refresh(serverUrls);
}
public static void deleteAndRefresh(ServerUrl serverUrl, ListView<ServerUrl>serverUrls) {
serverUrls.getItems().remove(serverUrl);
refresh(serverUrls);
}
public static void refresh(ListView<ServerUrl>serverUrls) {
ObservableList<ServerUrl> items = serverUrls.getItems();
serverUrls.setItems(null);
serverUrls.setItems(items);
}
}

View File

@@ -1,27 +1,60 @@
package com.dayrain.views;
import com.dayrain.entity.ConfigHolder;
import com.dayrain.entity.Configuration;
import com.dayrain.entity.Server;
import com.dayrain.entity.ServerConfig;
import com.dayrain.entity.ServerUrl;
import com.dayrain.handle.AddUrlHandler;
import com.dayrain.handle.DeleteUrlHandler;
import com.dayrain.handle.StartServerHandler;
import com.dayrain.handle.UpdateServerConfigHandler;
import com.dayrain.handle.UpdateUrlHandler;
import com.dayrain.server.ServerThread;
import com.dayrain.utils.FileUtils;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
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.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import javafx.util.Callback;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class HomePage {
private Stage primaryStage;
private Configuration configuration;
public HomePage(Stage primaryStage, Configuration configuration) {
private Stage primaryStage;
private final Configuration configuration = ConfigHolder.init();
private HashMap<String, ServerThread> threadMap = new HashMap<>();
private List<ListView<ServerUrl>> listViews = new ArrayList<>();
public HomePage(Stage primaryStage) {
this.primaryStage = primaryStage;
this.configuration = configuration;
}
public void start() {
@@ -41,28 +74,103 @@ public class HomePage {
menuBar.getMenus().addAll(menu1, menu2, menu3);
borderPane.setTop(menuBar);
//渲染服务列表
VBox serverContainer = new VBox();
//服务列表
VBox serverBox = new VBox();
List<ServerConfig> serverConfigs = configuration.getServerConfigs();
HBox urlBox = new HBox();
Label nameLabel = new Label("登录");
Label urlLabel = new Label("/wms/login");
Button configButton = new Button("配置");
Button deleteButton = new Button("删除");
urlBox.setSpacing(20d);
urlBox.setAlignment(Pos.CENTER_LEFT);
urlBox.getChildren().addAll(nameLabel, urlLabel, configButton, deleteButton);
TitledPane titledPane = new TitledPane("众华WMS", urlBox);
titledPane.setPrefWidth(600d);
serverBox.getChildren().addAll(titledPane);
borderPane.setLeft(serverBox);
for (ServerConfig serverConfig : serverConfigs) {
drawServerPanel(serverContainer, serverConfig, primaryStage);
}
borderPane.setLeft(serverContainer);
primaryStage.setScene(new Scene(borderPane));
primaryStage.setWidth(configuration.getWidth());
primaryStage.setHeight(configuration.getHeight());
primaryStage.show();
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent event) {
FileUtils.saveConfig(configuration);
}
});
}
public void drawServerPanel(VBox serverContainer, ServerConfig serverConfig, Stage primaryStage) {
VBox vBox = new VBox();
HBox headBox = new HBox();
Button editButton = new Button("配置参数");
Button openButton = new Button("开启服务");
Button addButton = new Button("添加接口");
Circle statusCircle = new Circle();
statusCircle.setRadius(10);
statusCircle.setFill(Color.RED);
//设置服务启动与关闭
openButton.setOnAction(new StartServerHandler(openButton, statusCircle, serverConfig, threadMap));
editButton.setOnAction(new UpdateServerConfigHandler(serverConfig, primaryStage));
headBox.getChildren().addAll(openButton, editButton, addButton, statusCircle);
HBox.setMargin(statusCircle, new Insets(0,0,0,30));
headBox.setSpacing(20d);
headBox.setAlignment(Pos.CENTER);
//添加url
ListView<ServerUrl> serverUrlListView = drawUrlPanel(serverConfig.getServerUrls(), serverConfig);
addButton.setOnAction(new AddUrlHandler(serverConfig, serverUrlListView, threadMap, primaryStage));
vBox.getChildren().addAll(headBox, serverUrlListView);
vBox.setSpacing(10d);
VBox.setMargin(headBox, new Insets(10, 0, 0, 0));
vBox.setPadding(Insets.EMPTY);
TitledPane titledPane = new TitledPane(serverConfig.getServerName(), vBox);
titledPane.setPrefWidth(600d);
serverContainer.getChildren().add(titledPane);
}
public ListView<ServerUrl> drawUrlPanel(List<ServerUrl> serverUrls, ServerConfig serverConfig) {
ObservableList<ServerUrl> urlList = FXCollections.observableArrayList(serverUrls);
ListView<ServerUrl> serverListViews = new ListView<>(urlList);
listViews.add(serverListViews);
serverListViews.setCellFactory(new Callback<ListView<ServerUrl>, ListCell<ServerUrl>>() {
@Override
public ListCell<ServerUrl> call(ListView<ServerUrl> param) {
ListCell<ServerUrl> listCell =new ListCell<ServerUrl>() {
@Override
protected void updateItem(ServerUrl item, boolean empty) {
super.updateItem(item, empty);
if(empty || item == null) {
setText(null);
setGraphic(null);
}else {
BorderPane urlPane = new BorderPane();
HBox labelBox = new HBox();
Label nameLabel = new Label(item.getUrlName());
nameLabel.setPrefWidth(100d);
Label urlLabel = new Label(item.getUrl());
labelBox.getChildren().addAll(nameLabel, urlLabel);
labelBox.setAlignment(Pos.CENTER_LEFT);
HBox btnBox = new HBox();
Button configButton = new Button("配置");
Button deleteButton = new Button("删除");
btnBox.setSpacing(15d);
btnBox.getChildren().addAll(configButton, deleteButton);
deleteButton.setOnAction(new DeleteUrlHandler(item, serverConfig, serverListViews, threadMap));
configButton.setOnAction(new UpdateUrlHandler(item, serverListViews, primaryStage));
urlPane.setLeft(labelBox);
urlPane.setRight(btnBox);
this.setGraphic(urlPane);
}
}
};
return listCell;
}
});
return serverListViews;
}
}

View File