Infofenster

MrZylinder

Aktives Mitglied
Hallo Forum,

ich hab da ein Problem und zwar:

Ich habe eine Arraylist..Ausgabe funktioniert so wie es soll.
Und ich habe ein Infofenster das sieht soweit auch ganz gut aus.
Aber jetzt kommt es. Ich möchte es so haben das wenn sich etwas verändert in der Arraylist das Infofenster aufgeht.

Java:
public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\KThrem\\Documents\\status.dat"));
		
		String lesen = br.readLine();
		ArrayList<String> list1 = new ArrayList<String>();
		
		
			while((lesen = br.readLine()) != null) {		
				if((lesen.contains("host_name=")) || (lesen.contains("current_state=")) || (lesen.contains("service_description="))) {
					list1.add(lesen);
					if((lesen.contains("current_state="))){
					list1.add("\r\n");
					list1.add("\r\n");
					}
				}	
			}
		
				System.out.println(list1);
Das is meine Arraylist. Als Ausgabe bekomm ich z.b.:

host_name=XY, current_state=0, service_description=PING

Also wenn current_state z.b. auf 1 geht soll das Fenster aufgehen:

Java:
public class Fenster {

	JFrame frame;
	
	public static void main(String[] args) {
		Fenster db = new Fenster();
	}
	
	public Fenster() {
		frame = new JFrame ("IcingaInfo");
		JButton button = new JButton("Click Me");
		button.addActionListener(new MyAction());
		frame.add(button);
		frame.setSize(400, 400);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public class MyAction implements ActionListener {
		  public void actionPerformed(ActionEvent e) {
		  JOptionPane.showMessageDialog(frame,"");
		  	}
	 }

}

In dem Fenster soll nur der Hostname, Status und Service stehn, bei dem sich der Status verändert hat.
Lässt sich das so realisieren wie ich gedacht habe, oder bin ich auf dem Holzweg.
Wenn es gehen sollte wie bringe ich diese 2 Quellcodes zusammen? (Ich habe in Eclipse ein Package mit diesen 2 "Programmen").

Schon mal Danke im Voraus!
Gruß Zylinder ^^
 

MrZylinder

Aktives Mitglied
Hallo,
ich hab mir das ganze mal angeschaut. Klingt gut aber vorher wollte ich noch etwas testen.
Wie kann ich meinem Infofenster das ich jetzt habe den Wert meiner ArrayList übergeben.

Java:
public class PopUpTest2 {
	JFrame frame;
	public static void main(String[] args) throws IOException {
		PopUpTest2 db = new PopUpTest2();
		BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\KThrem\\Documents\\status.dat"));
		
		String lesen = br.readLine();
		ArrayList<String> list1 = new ArrayList<String>();
		
		
			while((lesen = br.readLine()) != null) {		
				if((lesen.contains("host_name=")) || (lesen.contains("current_state=")) || (lesen.contains("service_description="))) {
					list1.add(lesen);
					if((lesen.contains("current_state="))){
					list1.add("\r\n");
					list1.add("\r\n");
					}
				}	
			}
				//System.out.println(list1);
	}	
	
public PopUpTest2() {
	frame = new JFrame ("IcingaInfo");
	JButton button = new JButton("KlickMich");
	button.addActionListener(new Aktion());
	frame.add(button);
	frame.setSize(400, 400);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public class Aktion implements ActionListener {
		  public void actionPerformed(ActionEvent e) {
		  JOptionPane.showMessageDialog(frame,"...");
		  	}
	 }
}

Weil immer wenn ich hier
Java:
JOptionPane.showMessageDialog(frame,"...");
anstatt dem ... meine list1 angeben will kommt da die Fehlermeldung: list1 cannot be resolved to a variable ... ist ja klar weil ich mir denke vorher soll mein Frame wissen was list1 is. Aber wie bring ich dem frame bei was list1 ist?
 
T

TryToHelp

Gast
Du kannst deine liste1 als Klassenvariable machen, dann ist sie in der ganzen Klasse bekannt. Also so wie deinen frame.
 

jgh

Top Contributor
Sichtbarkeit von Variablen!!!! Hier mal auf die schnelle mit static gelöst:

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class PopUpTest2 {
	JFrame frame;
	static ArrayList<String> list1;

	public static void main(String[] args) throws IOException {
		PopUpTest2 db = new PopUpTest2();
		BufferedReader br = new BufferedReader(new FileReader(
				"C:\\Users\\KThrem\\Documents\\status.dat"));

		String lesen = br.readLine();
		list1 = new ArrayList<String>();

		while ((lesen = br.readLine()) != null) {
			if ((lesen.contains("host_name="))
					|| (lesen.contains("current_state="))
					|| (lesen.contains("service_description="))) {
				list1.add(lesen);
				if ((lesen.contains("current_state="))) {
					list1.add("\r\n");
					list1.add("\r\n");
				}
			}
		}
		// System.out.println(list1);
	}

	public PopUpTest2() {
		frame = new JFrame("IcingaInfo");
		JButton button = new JButton("KlickMich");
		button.addActionListener(new Aktion());
		frame.add(button);
		frame.setSize(400, 400);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public class Aktion implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			JOptionPane.showMessageDialog(frame, list1);
		}
	}
}
 

MrZylinder

Aktives Mitglied
Bei mir ist wieder ein Problem aufgetreten:

Kann ich in einer ArrayList abhängigkeiten festlegen. Ich meine sowas wie Index 200 is verknüpft mit Index 202. Oder bestimmte Wörter von einander abhängig machen.

Zum Beispiel:

In meiner datei steht drin:

host_name=DNSServer
current_status=1

host_name=Firewall
current_status=1

host_name=Postfix
current_status=0

usw.....

Ich hatte folgende Idee:

Java:
while((lesen = br.readLine()) != null) 
			{
				if((lesen.contains("host_name=Postfix")) || (lesen.contains("current_state=1")) || (lesen.contains("current_state=2")) || (lesen.contains("current_state=3")))
				{
					list1.add(lesen);
				}
				else if((lesen.contains("host_name=DNSServer")) || (lesen.contains("current_state=1")) || (lesen.contains("current_state=2")) || (lesen.contains("current_state=3")))
				{
					list1.add(lesen);
				}
			}

current_state 1-3 weil ich die hosts die 0 haben nicht will. Aber jetzt gehts los.
Erste if anweisung
Java:
 if((lesen.contains("host_name=DNSServer")) || (lesen.contains("current_state=1")) || (lesen.contains("current_state=2")) || (lesen.contains("current_state=3")))
				{
					list1.add(lesen);
				}

DNSServer ist in der Datei...Super..schreib ich in meine ArrayList. Current_State is auch 1....Super schreib ich rein

Jetzt is es aber so. Wäre Current_State nicht 1 sondern 0.....schreibt er mir ja trotzdem DNSServer rein. Und genau das will ich nicht...

Kann ich da irgendwie nen zusammenhang herstellen?
 
T

TryToHelp

Gast
...
Java:
 if((lesen.contains("host_name=DNSServer")) || (lesen.contains("current_state=1")) || (lesen.contains("current_state=2")) || (lesen.contains("current_state=3")))
				{
					list1.add(lesen);
				}

DNSServer ist in der Datei...Super..schreib ich in meine ArrayList. Current_State is auch 1....Super schreib ich rein

Jetzt is es aber so. Wäre Current_State nicht 1 sondern 0.....schreibt er mir ja trotzdem DNSServer rein. Und genau das will ich nicht...

Du weißt, das || als operator ODER heißt, also wird wenn DNSServer drinnensteht er genommen egal ob 1 oder 0 oder sonstwas ist. Was du willst, ist ein UND name gleich und status gleich

Java:
 if((lesen.contains("host_name=DNSServer")) && ((lesen.contains("current_state=1")) || (lesen.contains("current_state=2")) || (lesen.contains("current_state=3"))))
				{
					list1.add(lesen);
				}

oder du willst name gleich und status nicht gleich, aber auch hier wieder und und nicht oder

Java:
 if(lesen.contains("host_name=DNSServer") &&  !lesen.contains("current_state=0"))
				{
					list1.add(lesen);
				}

und oder oder
 

MrZylinder

Aktives Mitglied
Du weißt, das || als operator ODER heißt
Ja das weis ich =)

Aber diesen Lösungsansatz hatte ich auch schon...

Java:
if((lesen.contains("host_name=DNSServer")) && (lesen.contains("current_state=1")) || (lesen.contains("current_state=2")) || (lesen.contains("current_state=3")))
				{
					list1.add(lesen);
				}

jetzt bekomm ich leider gar keine ausgabe mehr. Was ich absolut nicht verstehe da DNSServer vorhanden is UND current_state=1 ist.
 

Michael...

Top Contributor
Das macht ja keinen Sinn, da in einer Zeile ja nicht beides drin steht.
Du müsstest Dir entweder merken was Du in der jeweils "ersten" Zeile eingelesen hast und fügst das nur in die Liste ein wenn in der darauffolgenden Zeile current_state!=0 ist. Oder Du liest nach der "ersten" Zeile (!lesen.contains("current_state")) direkt die folgenden Zeile ein und prüfst den Wert (musst dann aber selbst die mögliche NullPointerException abfangen)

Noch besser wäre dann noch, Du schmeißt nicht irgendwelche Strings in eine Liste, sondern arbeitest mit eigenen Objekten, welche z.B. die Attribute hostname und state besitzen.
 

MrZylinder

Aktives Mitglied
Das problem is halt irgendwie komisch.

Im Prinzip hat meine Datei die ich durchlese mehrere ich sag mal "doppelte" Einträge was aber schon richtig ist da sie wie folgt aufgebaut is:

hoststatus:
current_state
host_name
check_latency
check_type
und und und

und dann noch den servicestatus enthält
host_name
current_state
has_been_checked

und und und....

So jetzt habe ich folgendes

Java:
while((lesen = br.readLine()) != null) 
			{
				if(lesen.contains("host_name=DNSServer") || lesen.contains("current_state=1") || lesen.contains("current_state=2") || lesen.contains("current_state=3"))
				{
					list1.add(lesen);
				}
			}

Die Ausgabe ist wie folgt dann

host_name=DNSSever, current_state=1, host_name=DNSSever

Weil ja der DNSServer einmal in hoststatus steht und einmal in servicestatus.
Dann hab ich mir halt gedacht lösch ich alle doppelten Einträge raus. Da is dann wiederrum das Problem das z.B. current_state=1
mehrmals drin stehn kann.

Ich steh jetzt einfach wieder auf dem schlauch (oder bin zu dumm -.-) das ich das 2. host_name=DNSSever nicht mit ausgebe....weil dann hab ich genau das was ich wollte.... hostname und den current_state.

Kann ich da irgendwie ein Kriterium angeben und sagen lies mir nur die rubrik durch wo hoststatus darüber steht?

servicestatus { <----diese Rubrik will ich dann quasi überspringen
host_name
service_description
modified_attributes
check_command
check_period
notification_period
check_interval
retry_interval
event_handler
has_been_checked
should_be_scheduled
check_execution_time
check_latency
check_type
current_state
}

hoststatus { <-----und die will ich auslesen
host_name
modified_attributes
check_command
check_period
notification_period
check_interval
retry_interval
event_handler
has_been_checked
should_be_scheduled
check_execution_time
check_latency
check_type
current_state
}
 
T

TryToHelp

Gast
Erstmal zu deinem code, da Fehlen Klammern das müsste so sein

Code:
if (a && (b || c || d))

wobei a,b,c und do für abfragen alla lesen.contains("host_name=DNSServer") sind.

dein Problem ist, das du eine Zeile ließt, aber du müsstes immer ein Päckchen lesen (mehrere Zeilen)
Haben die immer die Selbe anzeilen Zahlen, bzw kommt das nächste current_state immer alle 10 Zeilen? oder sind die Blöcke immer durch eine leerzeile getrennt?
 

MrZylinder

Aktives Mitglied
hoststatus { <---------------------So ein Block existiert 16 mal
host_name
modified_attributes
check_command
check_period
notification_period
check_interval
retry_interval
event_handler
has_been_checked
should_be_scheduled
check_execution_time
check_latency
check_type
current_state
last_hard_state
last_event_id
current_event_id
current_problem_id
last_problem_id
plugin_output
long_plugin_output
performance_data
last_check
next_check
check_options
current_attempt
max_attempts
state_type
last_state_change
last_hard_state_change
last_time_up
last_time_down
last_time_unreachable
last_notification
next_notification
no_more_notifications
current_notification_number
current_notification_id
notifications_enabled
problem_has_been_acknowledged
acknowledgement_type
acknowledgement_end_time
active_checks_enabled
passive_checks_enabled
event_handler_enabled
flap_detection_enabled
failure_prediction_enabled
process_performance_data
obsess_over_host
last_update
is_flapping
percent_state_change
scheduled_downtime_depth
}
ein block ist immer gleich groß. Der erste Block geht jetzt los bei Zeile 57-111...Der nächste bei 112-167
 

jgh

Top Contributor
... Noch besser wäre dann noch, Du schmeißt nicht irgendwelche Strings in eine Liste, sondern arbeitest mit eigenen Objekten, welche z.B. die Attribute hostname und state besitzen.

was spricht denn gegen den Lösungsansatz von Michael...?
 

MrZylinder

Aktives Mitglied
eigentlich nix...aber kommt das dann nicht auf das selbe raus.
In meinem Objekt steht doch dann so ein ganzer block?....oder zum Beispiel Hostname?
 
T

TryToHelp

Gast
Dann würde ich mir eine art parser klasse schreiben, die die daten einließt, bzw immer einen solchen block einließt und die benötigten Zeilen speichert, also host_name und current_state.

dann kannst du überprüfen ob host_name gleich DNSServer und current_state gleich 1, 2 oder 3

ich hoffe duverstehst was ich meine.

im notfall sowas wie 56 mal lesen und ignorieren, bei dem 57 mal lesen in string host_name speichern und dann wieder 13 mal lesen und nix machen und dann in den string current_state speichern, weitere x mal lesen und nix machen. und dann in der if abfrage, diese zwei strings testen ;-)
 

MrZylinder

Aktives Mitglied
im notfall sowas wie 56 mal lesen und ignorieren, bei dem 57 mal lesen in string host_name speichern und dann wieder 13 mal lesen und nix machen und dann in den string current_state speichern, weitere x mal lesen und nix machen. und dann in der if abfrage, diese zwei strings testen

Das klingt für mich als könnte ich meinem Programm sagen bzw. meiner schleife : Hey wenn du 16 mal hostname gefunden hast mach ein break.

Versteh ich das richtig?
Würd dann am besten mit ner ForSchleife funktionieren oder?
 
T

TryToHelp

Gast
mhh ja kannst du, würde das aber dann eher mit while machen alla

Code:
int anzahlHostname=0;
while(anzahlHostname<16){
   gelesen=lese;
   if (gelesen=hostname){
      anzahlHostname++;
      mache was du da noch machen willst;
   }
}
 

MrZylinder

Aktives Mitglied
Habs jetzt wie folgt geregelt, das Grundgerüst steht:

Java:
while((lesen = br.readLine()) != null && anzahlHost < 32) 
			{
				if(lesen.contains("host_name=") || lesen.contains("current_state="))
				{
					list1.add(lesen);
					anzahlHost++;
						if(lesen.contains("current_state="))
						{
							list1.add("\r\n");
						}
				}	
			}

Ich muss zugeben das is bei weitem nicht elegant. Und einige die sich damit mehr auskennen werden die Hände über dem Kopf zusammenschlagen. Aber ich bin froh das ich wenigstens mal das habe was ich wollte.

Nur noch eine Frage hab ich... wie ihr seht habe ich anzahlHost < 32 ... dann bekomm ich meine 16 Hosts ausgegeben. Mit anzahlHost < 16 bekomm ich 8 ausgegeben warum xD???
 

Michael...

Top Contributor
Und einige die sich damit mehr auskennen werden die Hände über dem Kopf zusammenschlagen.
meine volle Zustimmung
Nur noch eine Frage hab ich... wie ihr seht habe ich anzahlHost < 32 ... dann bekomm ich meine 16 Hosts ausgegeben. Mit anzahlHost < 16 bekomm ich 8 ausgegeben warum xD???
Einfach mal den Code anschauen: Die Zählvariable
Code:
anzahlHost
wird sowohl bei
Code:
host_name
als auch bei
Code:
current_state
inkrementiert. Da beide Inhalte paarweise vorkommen, hat sie den Wert n*2
 

MrZylinder

Aktives Mitglied
Ahso. Ja is klar.

Vielleicht noch etwas jetzt wo ihr meinen Code seht. Was kann man da eindeutig verbesseren.
Sollte ich gannz vonn der ArrayList weggehen oder so? :bahnhof:
 

Oben