Swing Verlinken auf externe Prozesse bsp. Mailprogramm, Inet. Browser

cup of java

Mitglied
Hallo Forum bin neu hier. Kurz was zu mir: Komme aus der Schweiz, bin 18, leidenschaftlicher Programmierer und Webdesigner (alles Selbstudium, als Hobby wohlbemerkt). Habe mir bereits Grundlagen sowie einige erweiternde Funktionalitäten (threads/(multiple) inheritance/interfaces/polymorphismus/grafics/swapping methods... etc.) sowie Grundlagen zu Java GUI (AWT + Swing, auch Applets) angeeignet. Ansonsten kenn ich mich mit html, css, php, javaScript, Ajax, "sql" und ein wenig xml aus; C/C++ und Pyton sind mir Begriffe, habe damit allerdings nicht sehr viel am Hut.

Momentan bin ich daran eine (xml basierende)Kundendatenbank aufzusetzen. Das hat soweit auch ganz nett gefunzt.
Nun wollte ich für gewisse Felder einen Cell-Renderer zuweisen um Zellen mit einer URL oder einer Emailadresse "auszuführen" sprich die externen Programme dafür (MS Outlook, Webbrowser). Kurz: Einige event listeners für externe Prozesse. Da man dies nicht mit simplem html-code in einem JLabel realisieren kann habe ich mal bissle gegoogelt und bin auch die Klasse Desktop gestossen - Traum mit Hacken. Es ist mir zwar gelungen die buttons zu rendern und die action events auszuführen, aber diese werden beinahe in einer Endlosschleife ausgeführt oder, was ich auch schon erreicht habe, dass der Browser zum Beispiel die Website öffnet (JFrame focus lost) und dann bei erneuter Interaktion mit dem Fenster (JFrame focus gained) sich dieser Prozess ständig wiederholt.

Zuerst wolle ich das alleine hinkriegen, habe aber inzwischen resigniert. Wäre extrem froh, wenn mir jemand von euch auf die Sprünge helfen könnte.

Danke schon mal im Voraus. Anbei noch die relevanten Code-Sniplets.

Java:
	/**
	 * Constructor
	 */
	public MyActionListener(String command) {
		this(command, null);
	}

	/**
	 * Constructor with argument
	 */	
	public MyActionListener(String command, Object target) {
		this(command, new Object[]{target});
	}
	
	/**
	 * Constructor with argument
	 */	
	public MyActionListener(String command, Object[] target) {
		this.command = command;
		this.target = target;
	}

Java:
			// get desktop
			Desktop desktop = null;
			if(Desktop.isDesktopSupported())
				desktop = Desktop.getDesktop();
			
			// email
			if(desktop.isSupported(Desktop.Action.MAIL)) {
	        	try {
	        		desktop.mail(new URI("mailto:"+(String)target[0]+"?subject=Test-Mail"));
	        	} catch(Exception ex) {}
	        	desktop = null;
	        }
			
		} else if(command == "openURL") {
			if(target == null) return;
			
			// get desktop
			Desktop desktop = null;
			if(Desktop.isDesktopSupported())
				desktop = Desktop.getDesktop();
			
			// browse
	        if(desktop.isSupported(Desktop.Action.BROWSE)) {
        		try {
        			desktop.browse(new URI("http://www."+(String)target[0]));
				} catch(Exception ex) {}
				desktop = null;
	        }
			
		}

Java:
			// table cell editor
			class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
			    
			    String currentValue;
				JButton btn0;
				
				public MyCellEditor() {
					btn0 = new JButton("homepage");
					btn0.setActionCommand("openURL");
					btn0.setBorderPainted(true);
				}
			    
			    public Object getCellEditorValue() {
			    	return currentValue;
			    }
			
			    // implement the one method defined by TableCellEditor.
			    public Component getTableCellEditorComponent(JTable table, Object value,
			    	boolean isSelected, int row, int col)
			    {
			    	currentValue = value.toString();
			    	btn0.addActionListener(new MyActionListener("openURL", currentValue));
			    	
			    	return btn0;
			    }
			}
 
Zuletzt bearbeitet:
F

freak_007

Gast
Wenn du etwas extern ausführen willst
Java:
try {
Runtime.getRuntime().exec("Befehl zum ausführen hier");
} catch(IOException ex) {
 ex.printStackTrace();
}
Aber es hat nichts mit Swing zu tun
 

cup of java

Mitglied
Danke erst einmal für deine Antwort.

Also ob ich jetzt die desktop oder diese runtime klasse nehme spielt wsl nicht so eine grosse Rolle, denn beides funzt. Nur, und das ist ja das Problem wird bei 1 Klick auf eine Zelle (mit Button und actionListener) dies ca. 20 mal aufgerufen d.h. ich habe nachher 20 mal den Firefox offen z.B. Das möchte ich verhindern. 1 Klick = 1 Aufruf.

Ich habe den Code oben noch angepasst.

Ah und wegen "gehört nicht hier her" kann ich nur sagen, dass es hier her gehört, weil ich diese Aufrufe aus einer JTable mache (mit Rendern) und das ist halt ein wenig anders als wenn man einfach schreibt:

Java:
JButton btn = new JButton("klick mich");
btn.addActionListener(openURL());

nicht?

Gruss,

CoJ
 
Zuletzt bearbeitet:
F

freak_007

Gast
Wenn du dich mit Threads auskennst kannst du eine Timeout funktion implementieren für jedes Action oder ActionListener weiter glaub ich kann ich dir nicht helfen außer das ich dir wenn du willst Codeschnipsel poste.
 

cup of java

Mitglied
Hmm also das mit den Threads hat halt genau das bewirkt, was ich vermutet habe: die Befehle werden auch 20 mal ausgeführt allerdings in regelmässigen Abständen gemäss Thread.sleep(ms).

Irgendwie ist da der Wurm drin. Gäbe es sonst noch andere, ähnliche Methoden/Möglichkeiten?

Gruss,

CoJ
 

cup of java

Mitglied
sag du es mir...

Java:
            // table cell editor
            class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
                
                String currentValue;
                JButton btn0;
                
                public MyCellEditor() {
                    btn0 = new JButton("homepage");
                    btn0.setActionCommand("openURL");
                    btn0.setBorderPainted(true);
                }
                
                public Object getCellEditorValue() {
                    return currentValue;
                }
            
                // implement the one method defined by TableCellEditor.
                public Component getTableCellEditorComponent(JTable table, Object value,
                    boolean isSelected, int row, int col)
                {
                    currentValue = value.toString();
                    btn0.addActionListener(new MyActionListener("openURL", currentValue));
                    
                    return btn0;
                }
            }

wie muss ich das denn nun machen. Es kann ja nicht sooooo schwer sein einen vernünftigen ActionListener auf eine Zelle zu bekommen??? Habt ihr nicht irgendwelche Beispiele, Vermutungen oder sonst was was mir helfen würde?

Gruss,

CuJ
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
Hatsi09 JTextArea Inhalt verlinken AWT, Swing, JavaFX & SWT 4
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
T Demo klick gui erstellen und fenster verlinken AWT, Swing, JavaFX & SWT 5
destroflyer Wort im JLabel verlinken (per HTML) AWT, Swing, JavaFX & SWT 3
F Von einem Fenster zum nächsten verlinken AWT, Swing, JavaFX & SWT 16
L GUI - 2 Buttons mit 2 Fenstern verlinken AWT, Swing, JavaFX & SWT 4
Augenblau JavaFX Externe Schriftart über CSS ansprechen und zuweisen AWT, Swing, JavaFX & SWT 5
A Swing Externe Klassen aufrufen und in einem bereits vorhandenen Container einfügen AWT, Swing, JavaFX & SWT 0
X buttons aus externe klasse lesen? AWT, Swing, JavaFX & SWT 3
H Event Handling Externe Method schliesst Hauptapplikation AWT, Swing, JavaFX & SWT 6
A Swing Externe Schriftart mitkompilieren für andere PCs? AWT, Swing, JavaFX & SWT 3
R LookAndFeel auf Gui Layout (externe Klasse) zugreifen AWT, Swing, JavaFX & SWT 6
T [SWT] Externe Programmfenster einbinden AWT, Swing, JavaFX & SWT 2
X Externe Anwendungen in JInternalframe starten. AWT, Swing, JavaFX & SWT 5
S Tastaturevents an eine externe Applikation weiter leiten AWT, Swing, JavaFX & SWT 6
W Externe Programme in JFrame starten AWT, Swing, JavaFX & SWT 4
G externe klassen auf gui objekte zugreifen lassen AWT, Swing, JavaFX & SWT 11
G externe ActionListener Klasse AWT, Swing, JavaFX & SWT 3
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
Z zu viele prozesse AWT, Swing, JavaFX & SWT 2
T Prozesse starten wenn JDialog erscheint AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben