Archief - [PROG]JAVA JFrame refreshen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

den Acid Burn

Legacy Member
lo,

ik ben een app aant maken dat een ip range pingt.
de bedoeling is dat hij telkens de ip die hij aan het pingen is append aan een JTextArea.
maar er gebeurt niet veel :)

java gui bazaar zit blijkbaar al erg ver...

hier is het stukse code dat voor de refresh zou moeten instaan:
PHP:
while (scan) {
				ip = InetAddress.getByName(start);
				
				//refresh frame
				basicFrame.getContentPane().remove(leftPanel);
				basicFrame.getContentPane().invalidate();
				pingTextArea.append("\npinging " + ip);
				basicFrame.getContentPane().add(leftPanel, BorderLayout.WEST);
				basicFrame.getContentPane().validate();
				basicFrame.getContentPane().repaint();
				
				if (ip.isReachable(ttl)) {
					pingTextArea.append(" --> online");
					online.addElement(ip);
					onlineTextArea.append(ip + "\n");
				}

dus om de 2000 milliseconden gaat hij het volgende ip pingen en zou dus die JTextArea moeten aangevuld worden.

*met system.out gaat de output wel

hope anyone can help me :)
grtz

den Acid Burn

Legacy Member
ja lijkt me ook erg vreemd
zal ff de volledige code pasten

PHP:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class PingBing {
	private InetAddress ip;
	private JFrame basicFrame;
	private JPanel leftPanel, rightPanel, statusPanel;
	private JTextArea pingTextArea, onlineTextArea;
	private JScrollPane leftScrollPane, rightScrollPane;
	private JTextField inputIP, inputTTL;
	private JLabel labelIP, labelTTL, statusLabel;
	private JButton btnStart, btnStop;
	private JMenuBar menuBar;
	private JMenu menu;
	private JMenuItem exitMenuItem;
	private String start;
	private int ttl;
	private boolean scan = true;
	private int number;
	private Vector online = new Vector();
	
	public PingBing() {	
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PingBing app = new PingBing();
		app.buildGUI();
	}
	
	public void buildGUI() {
//		JFrame.setDefaultLookAndFeelDecorated(true); 
		basicFrame = new JFrame("PingBing");
		basicFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		basicFrame.getContentPane().setLayout(new BorderLayout());
		
		//menu
		menuBar = new JMenuBar();
		menu = new JMenu("Menu");
		exitMenuItem = new JMenuItem("Exit");      
		menu.add(exitMenuItem);
		menuBar.add(menu);
		
		//leftPanel
		leftPanel = new JPanel();
		pingTextArea = new JTextArea(20,20);
		pingTextArea.setFont(new Font("Arial",Font.PLAIN,10));
		pingTextArea.setBackground(Color.WHITE);
		pingTextArea.setLineWrap(true);
		leftScrollPane = new JScrollPane();
		leftScrollPane.setViewportView(pingTextArea);
		leftPanel.add(leftScrollPane,BorderLayout.CENTER);
		leftPanel.setBorder(BorderFactory.createTitledBorder("pinging"));
		
		//rightPanel
		rightPanel = new JPanel();
		onlineTextArea = new JTextArea(20,20);
		onlineTextArea.setFont(new Font("Arial",Font.PLAIN,10));
		onlineTextArea.setBackground(Color.WHITE);
		onlineTextArea.setLineWrap(true);
		rightScrollPane = new JScrollPane();
		rightScrollPane.setViewportView(onlineTextArea);
		rightPanel.add(rightScrollPane,BorderLayout.CENTER);
		rightPanel.setBorder(BorderFactory.createTitledBorder("online"));
		
		//statusPanel
		statusPanel = new JPanel(new BorderLayout());
		btnStart = new JButton("start");
		btnStop = new JButton("stop");
		//btnStart.setEnabled(false);
		statusLabel = new JLabel(" Not Scanning.");
		statusLabel.setBorder(BorderFactory.createEtchedBorder());
		statusPanel.add(btnStart,BorderLayout.WEST);
		//statusPanel.add(btnStop, BorderLayout.WEST);
		statusPanel.add(statusLabel);
		
		//listeners toevoegen
		//exitMenuItem.addActionListener(new MenuHandler());
        btnStart.addActionListener(new ActionListener() {
        	public void actionPerformed(ActionEvent ae) {
        		start = "192.168.0.1";
        		ttl = 2000;
        		scan = true;
        		ping();
        	}
        });
        
        btnStop.addActionListener(new ActionListener() {
        	public void actionPerformed(ActionEvent ae) {
        		scan = false;
        	}
        });
		
		//menu en panels toevoegen aan frame
		basicFrame.getContentPane().add(menuBar,BorderLayout.NORTH);
		basicFrame.getContentPane().add(leftPanel,BorderLayout.WEST);
		basicFrame.getContentPane().add(rightPanel,BorderLayout.EAST);
		basicFrame.getContentPane().add(statusPanel,BorderLayout.SOUTH);
		
		//visualiseren van frame
		basicFrame.setSize(425,400);
		basicFrame.setLocation(200,200);
		basicFrame.setVisible(true);
		basicFrame.setResizable(false);

	}
	
	public void ping() {
		do {
			if (ttl < 1500) {
				int test = JOptionPane.showConfirmDialog(null, "You should provide a higher TTL to get a trustworthy result. Do you want to enter a new TTL value?", "warning", JOptionPane.YES_NO_OPTION);
				if (test == 0) {
					ttl = Integer.parseInt(JOptionPane.showInputDialog(null, "TTL in ms: ", "PingBing", JOptionPane.QUESTION_MESSAGE));
				}
				else {
					break;
				}
			}
		}
		while (ttl < 1500);	
		
		//replace . by : to perform String.split
		String startEncoded = start.replace('.',':');
		
		//starting ip
		String[] splitStart = startEncoded.split(":");
		int lengthStart = splitStart.length;
		
		//check if ip is valid
		for (int i=0; i<lengthStart; i++) {
			if (Integer.parseInt(splitStart[i]) < 0 || Integer.parseInt(splitStart[i]) > 255) {
				JOptionPane.showConfirmDialog(null, "please enter a valid ip", "error", JOptionPane.DEFAULT_OPTION);
				new PingBing();
			}
			if (Integer.parseInt(splitStart[lengthStart-1]) <= 0 || Integer.parseInt(splitStart[lengthStart-1]) >= 255) {
				JOptionPane.showConfirmDialog(null, "please enter a valid ip", "error", JOptionPane.DEFAULT_OPTION);
				new PingBing();
			}
		}
		
		number = Integer.parseInt(splitStart[lengthStart-1]);
		
		//System.out.println("scan started...");
		
		//ping ip's
		try {
			while (scan) {
				ip = InetAddress.getByName(start);
				
				System.out.println("pinging " + ip);
				
				//refresh frame
				basicFrame.getContentPane().remove(statusPanel);
				basicFrame.getContentPane().invalidate();
				statusLabel.setText("wicked");
				basicFrame.getContentPane().add(statusPanel, BorderLayout.SOUTH);
				basicFrame.getContentPane().validate();
				basicFrame.getContentPane().repaint();
				
				if (ip.isReachable(ttl)) {
					pingTextArea.append(" --> online");
					online.addElement(ip);
					onlineTextArea.append(ip + "\n");
				}
				
				if (number < 254) {
					number++;
					start = splitStart[0] + "." + splitStart[1] + "." + splitStart[2] + "." + number;	
				}
				else {
					scan = false;
					//System.out.println("\n\nscan finished");
				}
			}	
		}
		catch (UnknownHostException uhe) {
			//uhe.printStackTrace();
			JOptionPane.showConfirmDialog(null, "please enter a valid ip", "error", JOptionPane.DEFAULT_OPTION);
			new PingBing();
		}
		catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}
}

Kn0t

Legacy Member
Aangezien ping() rechtstreeks wordt aangeroepen vanuit een event listener, zal deze code uitgevoerd worden door de AWT event dispatching thread.
Dus gedurende de uitvoering van uw ping() methode, zal AWT event dispatching thread geen gui updates kunnen doen.

Oplossing is de ping() door een aparte thread te laten uitvoeren.

den Acid Burn

Legacy Member
idd

kheb van Ping een aparte class gemaakt die Runnable implements
nu bolt het perfect.

grtz
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan