Olá pessoal.
Eu desenvolvi uma janela a partir de um JFrame, com barra de título personalizada e suporte à efeitos visuais e gostaria de compartilhar com vcs. Quem puder testar e dar feedback eu agradeço. No jar estão os fontes, javadoc e binários (é só executar).
Eu utilizei a classe com.sun.awt.AWTUtilities para o formato e as transparências, mas não funciona no Debian, apesar dos métodos isTranslucencyCapable() e isTranslucencySupported() retornarem true. Alguém sabe porque?
Como JDialog herda de java.awt.Window, fica fácil. Dê uma olhada nas classes de efeito (TranlucencyEffect, ShadowEffect, ReflectionEffect, FaderEffect e AbstractWindowEffect). Todas possuem os métodos
void addWindow( Window w );
void applyEffect();
void removeEffect();
Então basicamente é utilizar essas classes para aplicar os efeitos no JDialog. Mas cuidado, nem todos os efeitos podem ser aplicados juntos à mesma janela, podem desconfigurar todo o visual.
public class frm_cadastro_grade_cor extends javax.swing.JDialog {
/** Creates new form frm_cadastro_grade_cor */
public frm_cadastro_grade_cor(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
FaderEffect e = new FaderEffect();
e.addWindow(this);
e.applyEffect();
e.removeEffect();
…
Tenho uma tela JFrame() que chame uma Jpanel (que é a citada acima).
Quando chamo o Jpanel pelo Jframe() chamo assim:
public class frm_cadastro_grade_cor extends javax.swing.JDialog {
/** Creates new form frm_cadastro_grade_cor */
public frm_cadastro_grade_cor(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
FaderEffect e = new FaderEffect();
e.addWindow(this);
e.applyEffect();
e.removeEffect();
…
Porém, eu tenho que apertar Alt+F4(fechar) para que a janela mostre o efeito… é como se estivesse outra jpanel oculta mas sem foco, ai quando dou Alt+F4, mostra a JPanel com o efeito…
sabe me dizer se estou fazendo o certo?
quando quiser adicionar o efeito FaderEffect tenho que fazer assim mesmo depois do InitComponents() da JPanel()?
FaderEffect e = new FaderEffect();
Realmente, tava com um pequeno bug.
Eu criei esse código no java 6, mas rodando no java 7 o compartamento mudou um pouco.
Fiz um ajuste na classe FaderEffect e agora funcionou.
Só tem um problema pra vc, pra funcionar o JDIalog tem que estar undecorated, o que pode complicar a funcionalidade do JDialog.
Mas segue o jar recompilado e um código que criei pra testar.
public class MyDialog extends JDialog {
private FaderEffect fe;
public MyDialog() {
super((JFrame)null, "MyDialog", true);
this.setLocationRelativeTo(null);
this.setUndecorated(true);
this.setSize(300, 200);
this.add(new JLabel("MyDialog"));
fe = new FaderEffect();
fe.addWindow(this);
}
public void open() {
fe.applyEffect();
}
public void close() {
fe.removeEffect();
}
public static void main(String[] args) {
MyDialog md = new MyDialog();
md.open();
try { Thread.sleep(5000); }
catch(InterruptedException e) {}
md.close();
}
}
Não querendo abusar, mas ja abusando…
Este efeito não se pode colocar em um JInternalFrame ?
Estou tentando colocar, mas pelo que estou vendo, é necessario que se tenha um frame do tipo Window, e o JInternalFrame() não é desse tipo
Muito bom este tópico!
Estou com uma dúvida relacionada a personalização. Vocês já passaram por este desafio abaixo?
Meu MDI abre uma JInternalFrame vazia.
Meu JInternalFrame adiciona meu JPanelCadastro.
Meu JPanelCadastro adiciona minha JPanelMinhaToolBar.
Meu JPanelMinhaToolBar possui um JButtonFechar.
Meu JButtonFechar precisa fechar a JInternalFrame.
Consigo acessar o JInternalFrame diretamente pela JPanelMinhaToolBar?
Não consegui acessá-lo nem pelo JPanelCadastro. Quando executo… this.getParent().setVisible(false); …o próprio JPanelCadastro fica invisível em vez do JInternalFrame.