Janela sempre "On-Top"

Pessoal, estou desenvolvendo uma aplicação para uma Lan - House aqui de minha cidade e estava pensando em colocar um relogio no canto da tela indicando quanto tempo ainda falta pra acabar o horario.

Até ai blz.

Só que nao sei como fazer uma janela ficar sempre “On-Top”.

Alguem ja fez algo parecido ou tem alguma idéia?

no Ruindow$?

use isso: http://www.esus.com/javaindex/j2se/jdk1.2/javaxswing/toplevelcontainers/jframe/jframealwaysontop.html

em multiplataforma? não sei…

cara…baixei o arquivo, chamei o metodo mas minha aplicação nao ficou sem ontop.

Lá tbm tem uma classe como exemplo mas ele tbm nao ficou ontop.
Vc sabe o porque?? Vc ja testou em qual sistema operacional?

[quote=“carioca”]cara…baixei o arquivo, chamei o metodo mas minha aplicação nao ficou sem ontop.

Lá tbm tem uma classe como exemplo mas ele tbm nao ficou ontop.
Vc sabe o porque?? Vc ja testou em qual sistema operacional?[/quote]

É não funcionou mesmo. Bom, mas nem tudo está perdido, eu sou totalmente contra, minha religião não permite, mas nada impede que você mesmo use jni e chame a função da API win32 que deixe a janela “always-on-top”. Eu “rascunhei” algo parecido aqui e funcionou, siga este tutorial:

1 - crie um JFrame (o meu ficou bem tosco, mas é só pra mostrar o exemplo) mais ou menos assim:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MeuFrame extends JFrame {

	static {
		System.loadLibrary("marciolx");
	}
	
	private native int getHwnd (String titulo);
	private native void setWindowAlwaysOnTop (int hwnd);

	private MeuFrame () {
		super("teste");
		getContentPane().add (new JButton("testando..."));
	}

	public static void main (String [] args) {
		MeuFrame f = new MeuFrame();
		f.pack();
		f.show();
		f.setWindowAlwaysOnTop(f.getHwnd(f.getTitle()));
	}

}

2 - compile-o e em seguida rode o javah sobre ele assim:

javac MeuFrame.java

javah MeuFrame

3 - Escreva a implementação das funções em C que chamam a API Win32 assim:

#include "MeuFrame.h"
#define STRICT
#include <windows.h>

JNIEXPORT jint JNICALL Java_MeuFrame_getHwnd(JNIEnv *env, jclass obj, jstring title)
{
HWND hwnd = NULL;
const char *str = NULL;

str = (*env)->GetStringUTFChars(env, title, 0);
hwnd = FindWindow(NULL,str);
(*env)->ReleaseStringUTFChars(env, title, str);

return (jint) hwnd;
}

JNIEXPORT void JNICALL Java_MeuFrame_setWindowAlwaysOnTop
(JNIEnv *env, jclass obj, jint hwnd)
{
SetWindowPos((HWND) hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

return;
} 

4 - Compile o arquivo, no meu caso eu usei o compilador de linha de comando do M$ Visual Studio 6 deste modo:

E:\trab\java\jni>cl /Ie:\j2sdk_nb\j2sdk1.4.2\include\ /Ie:\j2sdk_nb\j2sdk1.4.2\i
ncludewin32 /LD MeuFrame.c /Femarciolx.dll /link -subsystem:windows kernel32.lib
 user32.lib gdi32.lib advapi32.lib comdlg32.lib shell32.lib winmm.lib wsock32.lib

5 - Agora é só rodar o MeuFrame.class e constatar que como por milagre ele ficará sempre no topo de qualquer janela.

6 - Não me peça detalhes de como funciona cada coisa, para isso consulte o tutorial de JNI na Sun, a API do Win32 no M$DN ou a documentação do seu compilador C (você ainda não tem um? :shock: :? ), meu tempo é curto :wink:

Marcio, compilei o programa em C e deu esses erros?

[C++ Error] Unit1.cpp(13): E2288 Pointer to structure required on left side of -> or ->*

[C++ Error] Unit1.cpp(15): E2288 Pointer to structure required on left side of -> or ->*

Vc sabe o porque?
Se voce puder, pode me enviar a .dll ja compilada pro meu email?

carioca@ac.unisul.br

Valeu cara.

[quote=“carioca”]Marcio, compilei o programa em C e deu esses erros?

[C++ Error] Unit1.cpp(13): E2288 Pointer to structure required on left side of -> or ->*

[C++ Error] Unit1.cpp(15): E2288 Pointer to structure required on left side of -> or ->*

Vc sabe o porque?
Se voce puder, pode me enviar a .dll ja compilada pro meu email?

carioca@ac.unisul.br

Valeu cara.[/quote]

não sei, provavelmente são as opções de compilação ou linkagem, mas eu mandei a dll para o seu e-mail como carioca.dll :slight_smile:

[quote=“carioca”]Marcio, compilei o programa em C e deu esses erros?

[C++ Error] Unit1.cpp(13): E2288 Pointer to structure required on left side of -> or ->*

[C++ Error] Unit1.cpp(15): E2288 Pointer to structure required on left side of -> or ->*

Vc sabe o porque?
Se voce puder, pode me enviar a .dll ja compilada pro meu email?

carioca@ac.unisul.br

Valeu cara.[/quote]

mas porque você não tenta compilá-lo como c ao invés de c++? deve funcionar

valeu marcio, deu certo aqui. Compilei ela como dll pra C e nao C++ e deu certo.
Obrigado pela ajuda.