Java: Regarder et se Sentir


J'utilise Netbeans sur une machine Windows, ce qui se passe, c'est que si j'exécute le fichier java principal, l'apparence que j'obtiens est différente de celle que j'exécute tout le programme. Sens si je fais cela: entrez la description de l'image ici

Je reçois

entrez la description de l'image ici

Mais si je fais cela

entrez la description de l'image ici

Je reçois entrez la description de l'image ici

Avez-vous vu la différence dans l'apparence et la convivialité des deux sorties java? Pourquoi est-il là? Je veux que lorsque je l'exporte dans Jar, il devrait s'ouvrir comme le 1er cas, joli bouton. Comment?

Mise à Jour 1: J'ai trouvé le code suivant au début de mon main:

public static void main(String args[]) {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }

    //Some code here...
}

Il devrait donc définir l'aspect et la sensation du nimbus, mais le problème est que lorsque j'ouvre le pot, l'aspect et la sensation du Nimbus ne sont pas là

Mise à Jour 2: Un coup d'oeil de mon Navigator

entrez la description de l'image ici

Mise À Jour 3: Structure De Fichier

entrez la description de l'image ici

Author: Daksh Shah, 2014-03-31

6 answers

J'utilise Netbeans sur une machine Windows, que se passe-t-il si je exécutez le fichier java principal l'apparence que j'obtiens est différente de celle de le cas où je cours tout le programme.

Lorsque vous exécutez une application Swing, l'apparence par défaut est définie sur un L&F multiplateforme également appeléMetal . D'autre part, lorsque vous créez un nouvel assistant JFrame à partir de NetBeans New file, il inclut également une méthode main uniquement à des fins de test, ce qui rend les développeurs capables de "courir" le conteneur de niveau supérieur. Dans cette méthode main, l'apparence est définie sur Nimbuscomme vous l'avez inclus dans votre Update 1.

Ceci est bien expliqué dans ce Q&A: Comment puis-je changer l'apparence par défaut de Jframe? (Pas le thème de Netbeans) . Comme indiqué ici, vous pouvez modifier le modèle associé au formulaire JFrame pour définir le L&F que vous souhaitez. Cependant, soyez conscient de cette ligne:

Une application Java n'en a besoin que d'une main classe donc ce test-seulement main les méthodes doivent être supprimées lorsque vous déployez votre application. [...] le L & F ne devrait être établi qu'une seule fois au démarrage, pas dans tous les cas conteneur de haut niveau(JFrame, JDialog...).

Vous pouvez également jeter un oeil à Réglage par programme de l'Apparence de Comment définir l'apparence article.

Modifier

Je ne comprenais tout simplement pas une chose qui teste uniquement les méthodes principales besoin pour supprimer et si je les supprimer comment mon prg exécuter correctement?

Une application Java ne doit avoir qu'une seule méthode main qui initialise l'exécution. La classe qui a cette méthode main est définie dans le fichier MANIFEST.MF lorsque vous déployez votre JAR. Donc, avoir un main méthode dans chaque conteneur de niveau supérieur (JFrame ou JDialog) n'est pas nécessaire et ce n'est pas une bonne pratique.

Cependant, parfois, vous ne voulez pas exécuter toute l'application pour tester le fonctionnement d'un cadre/dialogue particulier. C'est pourquoi NetBeans inclut cette méthode main lors de la création de JFrame ou de JDialog. Mais comme indiqué ci-dessus lorsque vous déployez votre JAR, vous devez supprimer ces méthodes "extra" main.

Et yah, en ce que vous avez donné comment le faire quand je crée de nouvelles jframes, mais j'en ai déjà 20

Une application Swing a tipiquement un seul JFrame et plusieurs JDialog. Jetez un oeil à ce sujet pour plus de détails: L'utilisation de plusieurs JFrames, Bon / Mauvais La pratique?

Et de toute façon il est nimbus là et c'est ce que je veux, mais c'est pas ce qui ouvre

Il vous suffit de définir par programme L&F sur Nimbus dans votre classe main (celle qui est exécutée lorsque vous exécutez toute l'application). Vous pouvez y copier-coller le code que vous avez inclus dans votre Update 1.

Modifier 2

Lorsque vous créez un nouveau projet dans NetBeans, il vous demande de créer une classe principale trop. Disons que je créez un nouveau projet appelé Test, il me demandera de créer une classe principale comme celle-ci:

entrez la description de l'image ici

Cette classe Test générée aura la méthode main qui déclenche l'exécution de l'application:

entrez la description de l'image ici

Dans cette méthode, vous devez mettre le code que vous avez inclus dans votre mise à Jour 1:

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        try {
                            javax.swing.UIManager.setLookAndFeel(info.getClassName());
                            break;
                        } catch (ClassNotFoundException ex) {
                            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InstantiationException ex) {
                            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IllegalAccessException ex) {
                            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (UnsupportedLookAndFeelException ex) {
                            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }                                       
            }
        });
    }

}

Ensuite, lorsque vous exécutez votre application, le L&F sera défini sur Nimbus remplaçant le L&F multiplateforme par défaut. Désormais, tous créés Les composants Swing auront Nimbus comme L & F.

Remarque: La raison de SwingUtilities.invokeLater () l'appel est expliqué dans l'articleThreads initiaux .

 4
Author: dic19, 2017-05-23 11:58:09

Problème possible.

Si vous avez une classe principale à partir de laquelle vous lancez votre application, disons une classe Main. Si l'apparence n'est pas définie dans cette classe, le résultat sera ce que vous vivez.

Dites que vous avez Main d'où vous lancez MyFrame. (pardonnez la deuxième méthode principale, ce n'est que par exemple, comme dans le cas de l'OP)

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new MyFrame().setVisible(true);
            }
        });
    }
}

public class MyFrame extends JFrame {
    public static void main(String[] args) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
         ...

    }

Vous obtiendrez le résultat (même si l'apparence est définie sur MyFrame:

entrez la description de l'image ici


Si je cours juste MyFrame Je reçois:

entrez la description de l'image ici


Donc, si vous ajoutez le regard et la sensation de vous Main, il va obtenir ce résultat

public class Main {
    public static void main(String[] args) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
         ...

        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new MyFrame().setVisible(true);
            }
        });
    }
}

entrez la description de l'image ici

 3
Author: Paul Samsotha, 2014-03-31 12:37:20

, je recommanderais d'essayer de changer votre LAF dans votre méthode principale, comme:

public static void main(String[] args){
  Frame f; // Your (J)Frame or GUI-Class.
  // some code here...
  try{
    UIManager.setLookAndFeel(new NimbusLookAndFeel()) // Because it seems to be Nimbus what you want.
    SwingUtilities.updateComponentTreeUI(f); // To refresh your GUI
  }catch(Exception e){
    // Do whatever you want if a problem occurs like LAF not supported.
  }
}

, Ou vous pourriez le faire sans SwingUtilities.updateComponentTreeUI(f); si vous appelez

f.setVisible(true);

Après le changement de votre LAF.

 2
Author: maximus_de, 2014-03-31 10:14:09

Peut-être que vous pouvez essayer ceux-ci ?

UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

Modifier:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
 2
Author: Maciej Cygan, 2014-03-31 10:46:40

Si l'application. s'exécute en Java 1.6 sur le système (en dehors de l'E), il n'aurait pas accès à Nimbus (faites défiler vers le bas pour l'élément @since). Nimbus n'est devenu disponible qu'en 1.7.

 2
Author: Andrew Thompson, 2014-03-31 11:38:41

Pour déterminer l'aspect et la convivialité, vous pouvez lire le courant utilisé Regard Et la Sensation UIManager.getSystemLookAndFeelClassName()

Si vous connaissez votre apparence préférée, vous pouvez le définir avec UIManager.setLookAndFeel(look) (avant de créer vos éléments GUI!)

Mais rappelez-vous: vous devriez vérifier si ce look and feel est disponible (avant de le configurer sur un autre système d'exploitation avec un autre look and feels installé)

Plus loin informations:

MODIFIER: Pour déterminer l'apparence installée:

UIManager.LookAndFeelInfo plaf[] = UIManager.getInstalledLookAndFeels();
 1
Author: matt, 2014-03-31 11:33:12