我有一个Java日志记录器,它当前使用下面指定的设置输出到一个文件。我也有一个JavaFX TextArea,我希望我的记录器同时写入文件和TextArea。
记录器设置:
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = log.txt
记录器声明:
static Logger LOGGER;
static {
try(FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {
LogManager.getLogManager().readConfiguration(ins);
LOGGER = Logger.getLogger(BuildGet.class.getName());
initialContext = new InitialContext();
} catch (NamingException | IOException e) {
LOGGER.log(Level.WARNING,"ERROR LOGGER", e);
}
}
JavaFX TextArea:
```xml``<TextArea layoutX="20.0" layoutY="755.0" prefHeight="80.0" prefWidth="560.0" fx:id="logTextArea"/>`
播放示例时出错:
javafx.fxml.LoadException:
/C:/Users/slizo/Desktop/DConsole/target/classes/DConsoleScene.fxml:18
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:944)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:981)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:230)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:755)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2808)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2634)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2516)
at jmxClientConsole.gui.DConsoleFrame.start(DConsoleFrame.java:46)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NoSuchMethodException: jmxClientConsole.DConsoleFrameControllerGetMessage.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3349)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:939)
... 17 more
下面是我的startup class:
package jmxClientConsole.gui;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.image.Image;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import jmxClientConsole.BuildGet;
import jmxClientConsole.TextAreaHandler;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class ConsoleFrame extends Application {
static Logger LOGGER;
static {
try(FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {
LogManager.getLogManager().readConfiguration(ins);
LOGGER = Logger.getLogger(BuildGet.class.getName());
LOGGER.setUseParentHandlers(false);
} catch (IOException e) {
LOGGER.log(Level.WARNING," Eror ConsoleFrame ", e);
}
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
try {
FXMLLoader loader = new FXMLLoader();
URL xmlUrl = getClass().getResource("/ConsoleScene.fxml");
loader.setLocation(xmlUrl);
TextArea textArea = new TextArea();
textArea.setEditable(false);
textArea.setFont(Font.font("Monospaced", 13));
TextAreaHandler handler = new TextAreaHandler(textArea);
handler.setFormatter(new SimpleFormatter());
LOGGER.addHandler(handler);
Parent root = loader.load();
stage.setTitle("Console");
stage.getIcons().add(new Image(ConsoleFrame.class.getClassLoader().getResourceAsStream("logoC.png")));
stage.setScene(new Scene(root));
stage.show();
LOGGER.log(Level.INFO,"Success console ");
} catch (Exception e) {
LOGGER.log(Level.SEVERE,"Eror Console", e);
}
}
}
我在评论中写的关于控制器的东西,我有这个。我有所有的逻辑按钮在里面:
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="900.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jmxClientConsole.ConsoleFrameControllerGetMessage">
1条答案
按热度按时间xam8gpfp1#
最终,您需要一个
java.util.logging.Handler
,它将日志消息附加到TextArea
。下面是一个相对简单的实现:上面的代码可以这样使用:
不幸的是,我不知道如何(如果可能的话)您可以从文件中配置它。至少,如果没有某种间接获取
TextArea
的方法(例如,依赖注入、JNDI(?)等)。你已经编辑了你的问题,说你得到了这个错误:
这是一个独立的问题,而不是你最初问的问题。然而,该错误告诉您,某些代码期望您的类(如错误中所指定的)具有无参数构造函数,但该构造函数不存在。
如果该类用作FXML控制器,那么请注意,默认控制器工厂需要一个无参数构造函数。要么添加那个构造函数,要么设置一个自定义的控制器工厂(如何做超出了这个Q&A的范围;应该有教程,可能还有其他的Stack Overflow Q&A)。