Colocando link em um label/botão

Oi pessoal

Queria que, quando alguém clicasse em um label ou button, o browser padrão fosse aberto com um link X. Como posso fazer isso?

obrigado

Runtime.exec() nao vale :wink:

Rafael

Considerando uma app swing…
Utiliza:

String BROWSER = "mozilla";
String url = "http://www.guj.com.br";
Runtime.getRuntime().exec(BROWSER+" "+url);

Funciona no linux, acredito que o IE seja a mesma coisa…

Abraços

PS: A segurança não pode sr muit restritiva no sistema

MODIFICADO: Foi mal, postamos juntos Rafael!!!

oi duardor

realmente nao queria essa opcao de Runtime.exec… sera que nao tem outra?

Ih, Paulo, aho difícil, heim!

Runtime faz o fork() numa máquina UNIX [e o execv() depois] no método exec(String), como você pdoeria chamar alguma System Call de dentro da JVM? Na verdade, só criando algo em C e usando JNI :wink:

Fora que máquinas UNIX não possuem browser padrão como as Windows. Existe a variáveld e ambiente BROWSER, mas isto é um padrão meio que obscuro.

Mas porque não usar Runtime? É o jeito de exntrar em contato com algumas funções do SO…

[]s

Realmente vai ser difícil. “Browser Padrão” é uma coisa definida no SO.
A linha de comando “mozilla http://www.guj.com.br” só funciona com o mozilla instalado, já “http://www.guj.com.br”, no windows, simplesmente chama o browser padrão, seja qual for. O problema são os outros SOs.
Acho que você deveria criar um método que testa o SO antes e usa uma ou outra forma de jogar uma URL pro SO.
Se houver uma forma de fazer isso sem Runtime.getRuntime() também gostaria de saber…

“Open a default web browser in Java, cross-platform!” :smiley:

http://browserlauncher.sourceforge.net/

[edit] Depois de enviar essa resposta, fui ler a documentação do tal BrowserLauncher e a única coisa que ele faz é tudo isso o que foi descrito acima, testando o SO e tentando abrir o default (em MacOS e Windows) ou simplemente tentando executar o Netscape (em *x)…meio feio, mas resolve mais ou menos o problema [/edit]

[quote=“dsiviotti”]
Acho que você deveria criar um método que testa o SO antes e usa uma ou outra forma de jogar uma URL pro SO.[/quote]

êpa, testar o SO??!?!

Tipo assim:

#IFDEF UNIX
...
#IFDEF WINDOWS
...

Onde foi mesmo que já vi isso? :lol:

[]s

Se nao vai ajudar, nao atrapalha neh Shoes?! :stuck_out_tongue:

Pô, é uma santa ajuda, rapá!!

Começa assim: vamos colcar issoaquizinhu só pra versão LINUX… depois vem o inferno dos DEFINEs

Até manpage e readme com #IFDEF, já vi muito disso…

Se é pra ser dependente de SO, é melhor fazer em C++ :stuck_out_tongue: .

[]s

Qual a sua solucao, entao, Philip? :wink:

Exceto pelo Runtime, o mais perto que vejo sem eprda de sanidade é esse aqui.

[]s

Já pensou em usar o JDIC e seu browser nativo embutido, Paulo?

Pô, é uma santa ajuda, rapá!!

Começa assim: vamos colcar issoaquizinhu só pra versão LINUX… depois vem o inferno dos DEFINEs

Até manpage e readme com #IFDEF, já vi muito disso…

Se é pra ser dependente de SO, é melhor fazer em C++ :stuck_out_tongue: .

[]s[/quote]

Philip, sei que sua pergunta é brincadeira, mas mesmo que alguém resolva detonar a portabilidade, existem outros mil motivos para usar java ao invés de C++. Fora isso, testar o SO num simples IF e dependendo do resultado executar um ou outro Runtime.getRuntime("linux’, “windows”, “X”) não é nenhum crime. Não afeta em nada a portabilidade já que, se testa antes, pode ser rodar “quase anywhere”.
Li o post que você lincou e concordo com o questionamento do conceito “Browser Padrão”. Windows não tem Gnome nem KDE mas tem Browser Padrão, reflitamos sobre isso. Talvez o problema esteja em como definir um Browser Padrão em um SO que desconhece este conceito, pois ficou parecendo que a culpa é do Java que não tem solução para isso; e não é.
Há algum tempo não uso Linux, mas lembro que não admitia ter que usar um comando ao invés de dar um duplo clique. Por que tenho no Windows e nção tenho no Linux? Sei que existe diferença estrutural entre um e outro mas se um cliente me pede “o programa deve chamar o Browser Padrão ao clicar” eu vou chamar o Browser Padrão, mesmo que tenha que criar a classe BrowserPadrao. :?

Ok, Douglas,

Sim, existem motivos para se utsar C++ e existem motivos para usar Java, isso é uma discussão enoooorme que já foi feita em vários lugares, portanto vamos deixar para lá.

Quanto ao browser padrão no UNIX, lembro que a política máxima do sistema [uma das] é: mechanism, not policy. Ou seja: eu deixo você fazer, não te obrigo a nada. Por isto um UNIX não tem X padrão, gerenciador de janelas padrão, ou algo assim. Tudo é escolha do usuário, do $EDITOR ao $BROWSER :wink:

O livro do Raymond é muito bom quanto a uns ‘por que isso é assim?’ no mundinho *NIX.

[]s

Meu amigo pcalcado voce pode simplismente ao instalar seu sistema pedir para o usuario selecionar o caminho do browser padrão dele numa janela tipo FileChooser seria legal, e ele poderia escolher o browser que lhe achasse melhor, ainda poderia testar o SO dar caminhos padrões para determinada plataforma como “c:arquivos de programas …” “/usr/bin/…”, mas se você quer apelar poderia fazer isso no ambiente win32 sem problemas com JNI chamando a API ShellExecute

HINSTANCE ShellExecute(         
    HWND hwnd,
    LPCTSTR lpOperation,
    LPCTSTR lpFile,
    LPCTSTR lpParameters,
    LPCTSTR lpDirectory,
    INT nShowCmd
);

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

sem $ da URL,pode mostrar conteudo do concorrente ? :shock:

mas isso mandaria a portabilidade para o ralo já que não existe tal função na plataforma *nix mas você tem a escolha !!!

qualquer coisa estamos ai!
fui!

Você leu o link que passei?

[]s

pow kra foi mau, tava meio tarde quando respondi o post e muito cafe sabe né !!! :smiley: mas aqui esta uma solução que serve para plataforma win32 usando JNI:

Crie um arquivo chamado BrowserPadrao.h com o seguinte conteudo:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class guj_util_BrowserPadrao */

#ifndef _Included_guj_util_BrowserPadrao
#define _Included_guj_util_BrowserPadrao
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     guj_util_BrowserPadrao
 * Method:    openURL
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_guj_util_BrowserPadrao_openURL
  (JNIEnv *, jobject,jstring);

#ifdef __cplusplus
}
#endif
#endif

Depois crie um arquivo chamado BrowserPadrao.cpp com o conteudo:

#include <windows.h>
#include <jni.h>
#include "BrowserPadrao.h"

JNIEXPORT void JNICALL Java_guj_util_BrowserPadrao_openURL(JNIEnv *env, jobject object,jstring url)
{
	//Cria um ponteiro para uma "string" com o conteudo da string 
	//passada fazendo as devidas converssões
	const char *str = env->GetStringUTFChars(url, 0);
	
	//Verifica o valor de retorno não e nulo
	if(str != NULL)
		//Chama a função da API WIN32 ShellExecute para maiores detalhes verique a API
		LONG r =(LONG) ShellExecute(NULL, "open",str, NULL, NULL, SW_SHOWNORMAL);
	
	//Faz as devidas limpezas, pois somos programadores limpinhos :)	
	env->ReleaseStringUTFChars(url, str);
}

Para compilar o exemplo no MSVC, não se esqueça de mudar o diretorio para o do seu SDK
cl -Ic:javasdkinclude -Ic:javasdkincludewin32
-LD BrowserPadrao.cpp -Fbrowserjava.dll

Para compilar no MINGW
gcc -c -Ic:javasdkinclude
-Ic:javasdkincludewin32 BrowserPadrao.cpp
gcc -shared -o BrowserPadrao.dll BrowserPadrao.o

Quem não quiser fazer a DLL pode baixar ela ja pronta daqui
http://www.sicop.com.br/utilbrowser.zip[/url]

Segue abaixo a Classe BrowserPadrao não mude o nome do package, senão tera de ser mudado nos arquivos .h e .cpp

/*
 * Created on 16/07/2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package guj.util;

/**
 * @author William J. Oliveira
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class BrowserPadrao {
	//Carregando a biblioteca .DLL contendo a função nativa
	//Carrega apenas uma vez a biblioteca pois esta entre static
	static {
		Runtime.getRuntime().loadLibrary("browserjava");
	}

	//Função nativa que abre uma URL com seu programa padrão
	//poderia ter implementado melhor para capturar exceptions 
	//mas estava sem tempo então cuidado com oque passa aqui
	//tem de ser uma URL valida :)
	public native void openURL(String url);
}

Segue um exemplo de como usar a Classe:

/*
 * Created on 16/07/2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package guj.util;

/**
 * @author William J. Oliveira
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class Teste {

	public static void main(String[] args) {
		//Criando uma instancia da classe BrowserPadrao 
		BrowserPadrao padrao = new BrowserPadrao();
		//Abrindo o browser padrão em uma URL especifica
		padrao.openURL("http://www.guj.com.br");
		//Abrindo o Leitor de Email padrão em com um email especifico
		padrao.openURL("mailto:william@sicop.com.br");
		//Abrindo um arquivo .mp3 com o Player padrão
		padrao.openURL("c:\musicas\something.mp3");
	}
}
	

Bom galera e isso ai, funciona direitinho qualquer duvida podem postar aqui !

e desculpe qualquer coisa :wink:

See ya !!![url]