Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Запитване относно JTextArea и Logger

Featured Replies

Така имам готов сървър които го ползвам под CMD с .bat файл в които зареждам jar файла но искам да си направя чрез JavaFX Scene Builder направил съм всичко обаче .... не мога да разбера как да направя listener za logger така че всички log съобщения да ми ги изкарва в TextArea ще съм много Благодарен за малко помощ ^_^ 

Така имам готов сървър които го ползвам под CMD с .bat файл в които зареждам jar файла но искам да си направя чрез JavaFX Scene Builder направил съм всичко обаче .... не мога да разбера как да направя listener za logger така че всички log съобщения да ми ги изкарва в TextArea ще съм много Благодарен за малко помощ ^_^ 

Здравейте !

 

Ще се опитам да помогна въз основа на това, което успях да разбера от запитването Ви.

Накратко, въпросът Ви е "Как да се напише event listener, който при някакви действия да прави запис в Text Area-та ?".

Първо, event listener-ите се активират при създаден event, който в основата си представлява събитие, свързано с интеркативността между потребител и система.

Такива събития са въвеждане от клавиатура, работа с мишка, въвеждане в полета и т.н. Т.е. това са събития, генерирани от потребителя по един или друг начин.

Във Вашия случай, целта е един logger, вместо да пише в конзолата и/или външен файл, да бъде насочен към даден визуален компонент. 

Създаването и имплементирането на event handling механизъм за това е излишен. 

 

Може директно, когато искате да логвате някакво събитие, съобщението, което се логва да се append-ва към текущите данни в самaта TextArea.

А това може да се постигне по няколко начина:

1) Ако съобщенията, които искате да се логват са изцяло под Ваш контрол, то с директно append-ване ще се получи на мига:

JTextArea area = new JTextArea();
area.setText(area.getText()+"\n"+"NEW_LOG_MESSAGE_LINE");

Това се добавя на мястото на самото логване и/или в комбинация с него.

2) Ако съобщенията, които искаме да логваме са и системни, трябва да се пренасочи самия Logger към друг Handler.

Това може да стане по следния начин, описан по - подробно тук.

За целта, трябва да създадете конфигурационен файл за Logger-а и да добавите описаните редове за ниво на logging (TRACE/DEBUG/INFO/WARN/ERROR) и кой клас ще handle-ва писането публикуването на самите съобщения.

 

Надявам се, че това ще Ви бъде от полза.

 

Поздрави !

Редактирано от soundtracker (преглед на промените)

  • Автор

Дадения начин съм го пробвал обаче всички съобщения ми излизат само при еррор не в реал тиме накратко все едно чака на Waitfor.... 

Дадения начин съм го пробвал обаче всички съобщения ми излизат само при еррор не в реал тиме накратко все едно чака на Waitfor.... 

Т.е. съобщенията (независимо дали са INFO, WARN и т.н.) излизат само ако се получи ERROR, или само ERROR съобщения се логват ?

Ако е първото, нещата са кофти - означава, че UI-я не рендва промените по самия обект. За този случай, не се сещам за красиво решение, освен с Worker нишка да се вика repaint метода.

Ако е второто, означава, че трябва да вдигнете нивото на логване - т.е. ако в output-а на логъра се логват само ERROR-и, това е конфигурационен проблем, а не на изпълнение.

Иначе, с EventHandler-ите, не съм убеден, че ще се спаси положението. Освен ако самия logger не хвърля собствени събития за логване, то няма какво да се "лови". Например да има клас, подобен на LoggingEvent от пакета на log4j, който да се опитваме да прихванем. 

 

Ако все още има проблеми, тази вечер ще се опитам да направя подобна постановка, за да проверя с нормалния Java Logger какво може да се постигне откъм event propagation support.

 

Поздрави !

  • 1 година по-късно...

А кой  logger използвате? Искате ли той да продължава да печата в конзолата или в даден файл или просото да пренасочите целият поток към TextArea?

Примерно така?

import java.io.OutputStream;
import java.io.PrintStream;
import java.util.logging.Logger;

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
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)
	{
		Group root = new Group();
		Scene scene = new Scene(root, 600, 330, Color.WHITE);
		
		GridPane gridpane = new GridPane();
		gridpane.setPadding(new Insets(5));
		gridpane.setHgap(10);
		gridpane.setVgap(10);
		
		final TextArea ta = new TextArea();
		@SuppressWarnings("resource")
		PrintStream ps = new PrintStream(new Console(ta), true);
		System.setOut(ps);
		System.setErr(ps);
		
		final Button btn = new Button("Съобщение");
		Logger logger = Logger.getLogger(Main.class.getName());
		btn.setOnAction(e ->
		{
			logger.info("message");
		});
		final Button btn2 = new Button("Внимание");
		btn2.setOnAction(e ->
		{
			logger.warning("warrning");
		});
		
		ta.setPrefRowCount(10);
		ta.setPrefColumnCount(100);
		ta.setWrapText(true);
		ta.setPrefWidth(150);
		GridPane.setHalignment(ta, HPos.CENTER);
		gridpane.add(ta, , 1);
		gridpane.add(btn, 1, );
		gridpane.add(btn2, 2, );
		
		root.getChildren().add(gridpane);
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	
	public static class Console extends OutputStream
	{
		
		private final TextArea output;
		
		public Console(TextArea ta)
		{
			this.output = ta;
		}
		
		@Override
		public void write(int i)
		{
			output.appendText(String.valueOf((char) i));
		}
	}
}

 

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.