Aplicar LookAndFeel num objeto jFrame

6 respostas
N
Declarei o seguinte objeto:
public static MainFrame m = new MainFrame();
para ser meu Frame:
public static void main(String args[]) {

        //aplica o look and feel do windows
        //retirado de http://www.java2s.com/Tutorial/Java/0240__Swing/WindowslookandfeelinJava6.htm
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                //m.setLocation(20, m.getLocation().y);
                m.setVisible(true);
            }
        });

    }
mas o problema é que o...
try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
nao funciona para esse objeto que criei. Mas, caso eu use:
public static void main(String args[]) {

        //aplica o look and feel do windows
        //retirado de http://www.java2s.com/Tutorial/Java/0240__Swing/WindowslookandfeelinJava6.htm
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                //m.setLocation(20, m.getLocation().y);
                //m.setVisible(true);
                new MainFrame().setVisible(true);
            }
        });

    }
aí funciona!

Entao, como aplicar o LookAndFeel para meu objeto "m"? Além disso, gostaria de saber se tem como mudar o visual do editor do netbeans, para que eu possa pré visualizar os estilos Metal, Nimbus, Windows Classic... etc, e não somente o visual padrão do editor.

ps: nao posso abrir mao desse objeto pq tenho threads utilizando-o.

Obrigado!

6 Respostas

ViniGodoy

Após aplicar o seu look and feel, rode o comando:

SwingUtilities.updateComponentTreeUI(m);
E

E de qualquer maneira não é muito legal fazer isso que você fez:

static MainFrame m = new MainFrame();

porque um objeto Swing está sendo instanciado ANTES mesmo de o “main” rodar. Isso pode provocar problemas sérios de inicialização (porque você não controla mais a ordem de inicialização das coisas e você pode acabar se perdendo). Se realmente quer ter apenas um objeto MainFrame no seu código, inicie-o no main ou por algum método chamado por ele.

static MainFrame m; 
...
...
...
    m = new MainFrame();
...
N

O comando do Viny funcionou :slight_smile:

@enta~
Eu sou iniciante em java. Eu fiz isso pq preciso manipular algumas coisas no meu Frame a partir de threads que criei. Se eu nao declarar o frame como variavel global eu nao consigo acessa-lo. Ou existe outra forma de fazer isso?

Obrigado pela ajuda

E

Veja que eu não mudei o escopo da sua variável (ela continua “static”, o que você chama de “global”).

Eu só pedi para você inicializá-la um pouco depois, para você mesmo controlar a ordem de inicialização.

ViniGodoy

Funcionou sim. Só fique atento que o fabricante não recomenda usa-lo. Siga a dica do entanglement.
É suicídio programar sem saber exatamente o que você está fazendo.

E evite static e variáveis globais. Eles são pouco seguros em ambientes multi-thread, e são a principal fonte de memory leaks.

N

Obrigado pela dica, vou procurar segui-la.

Criado 9 de outubro de 2010
Ultima resposta 11 de out. de 2010
Respostas 6
Participantes 3