Boa tarde senhoras e senhores do universo GUJ. Vamos ao problema: percebi esses dias que os últimos programas desenvolvidos com JAVA que se utilizam de uma JFrame para exibir seu conteúdo sofrem de um mal constante quando executado junto ao Windows 7. Todas as JFrame`s sofrem falha de repintura na tela chegando a travar completamente o conteúdo da JFrame após ampliação/redução automática feita pelo Windows 7.
Como causar o problema?
Execute um programa em java o qual utiliza uma JFrame para mostrar um conteúdo qualquer. Para servir de exemplo, use este código abaixo que copiei de uma pergunta feita por um dos colegas aqui no fórum (mas poderia ser qualquer outro):
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CadastroCliente1 extends JFrame {
private JTextField cpftxt;
private JTextField nometxt;
private JTextField ruatxt;
private JTextField estadociviltxt;
private JTextField telefone1txt;
private JTextField telefone2txt;
private JLabel cpflbl;
private JLabel nomelbl ;
private JLabel rualbl;
private JLabel estadocivillbl;
private JLabel telefone1lbl;
private JLabel telefone2lbl;
private JFrame Janela;
private JButton cadastrarbtn;
private JPanel pnlDadosPessoais;
private JPanel pnlEndereco;
private JPanel pnlContatos;
public static void main(String args[])
{
new CadastroCliente1();
}
public CadastroCliente1 ()
{
nometxt = new JTextField();
nometxt.setLocation(150, 100);
nometxt.setPreferredSize(new Dimension(100, 30));
cpftxt = new JTextField();
cpftxt.setLocation(90, 10);
cpftxt.setSize(100, 30);
ruatxt = new JTextField();
ruatxt.setLocation(100,200);
ruatxt.setSize(100,30);
estadociviltxt = new JTextField();
estadociviltxt.setLocation(90, 10);
estadociviltxt.setSize(100, 30);
telefone1txt = new JTextField();
telefone1txt.setLocation(90, 10);
telefone1txt.setSize(100, 30);
telefone2txt = new JTextField();
telefone2txt.setLocation(90, 10);
telefone2txt.setSize(100, 30);
nomelbl = new JLabel ("Nome: ");
nomelbl.setLocation(100, 10);
nomelbl.setSize(10, 30);
cpflbl = new JLabel ("CPF: ");
cpflbl.setLocation(100,50 );
cpflbl.setSize(100, 30);
rualbl = new JLabel ("Rua : ");
rualbl.setLocation(10,20);
rualbl.setSize(150,50);
estadocivillbl= new JLabel ("Estado Civil: ");
estadocivillbl.setLocation(10,300);
estadocivillbl.setSize(150,50);
telefone1lbl= new JLabel ("Telefone Residencial: ");
telefone1lbl.setLocation(60,10);
telefone1lbl.setSize(150,20);
telefone2lbl= new JLabel ("Telefone Celular: ");
telefone2lbl.setLocation(10,350);
telefone2lbl.setSize(150,10);
cadastrarbtn = new JButton("Cadastrar");
cadastrarbtn.setLocation(10,190 );
cadastrarbtn.setSize(110, 30);
Janela = new JFrame();
Janela.setTitle("Cadastro de Cliente ");
Janela.setLayout(null);
Janela.setLocationRelativeTo(null);
Janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Janela.setSize(800,500);
Janela.setVisible(true);
JPanel pnlDadosPessoais = new JPanel();
pnlDadosPessoais.setBorder(BorderFactory.createTitledBorder("Dados Pessoais: "));
pnlDadosPessoais.setSize(new Dimension(760, 150));
pnlDadosPessoais.setBounds(10, 10, 760, 150);
pnlDadosPessoais.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel pnlEndereco = new JPanel();
pnlEndereco.setBorder(BorderFactory.createTitledBorder("Endereço: "));
pnlEndereco.setBounds(10, 160, 760, 150);
pnlEndereco.setSize(new Dimension(760, 150));
pnlEndereco.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel pnlContatos = new JPanel();
pnlContatos.setBorder(BorderFactory.createTitledBorder("Contatos: "));
pnlContatos.setSize(new Dimension (760, 150));
pnlContatos.setBounds(10, 310, 760, 150);
pnlContatos.setLayout(new FlowLayout(FlowLayout.LEFT));
Janela.add(pnlContatos);
pnlContatos.add(telefone1lbl);
Janela.add(pnlDadosPessoais);
pnlDadosPessoais.add(nomelbl);
pnlDadosPessoais.add(nometxt);
pnlDadosPessoais.add(cpflbl);
pnlDadosPessoais.add(cpftxt);
pnlDadosPessoais.add(estadocivillbl);
pnlDadosPessoais.add(estadociviltxt);
Janela.add(pnlEndereco);
pnlEndereco.add(rualbl);
pnlEndereco.add(ruatxt);
Janela.show();
}
}
Já com o programa em execução, clique na “borda” (para ampliar a janela, não arrastar) superior do JFrame e arraste ela para o topo da sua área de trabalho até que o windows 7 mostre rapidamente um círculo azul e uma sobra preta (contorno) do ajuste automático em volta da JFrame que ele fará de forma que fique entre o topo e a barra de tarefas da sua área de trabalho sem espaços e solte o botão do mouse. Agora repare que a tela do JFrame e seu conteúdo estão travados e poderá aparecer espaços em preto não repintados após ajuste automático da janela pelo Windows 7… um verdadeiro BUG! (Lembrando que este Win7 está utilizando todo o seu recurso gráfico ao máximo, com Aero).
E agora? Existe solução para correção?
Feliz 2012 com muita luz. 8)



Mas nosso colega gpellizzoni conseguiu…


