2016-01-22 4 views
-1

J'ai un JButton dans un JPanel qui a des graphiques, mais le bouton ne montrera pas comme il est dans la couche au-dessous des graphiques. J'ai déjà lu ceci: Put JLabel in front of Graphics 2D Rectangle in JPaneljava - Mettre JComponent devant les graphiques dans NullLayoutManager?

Mais les réponses me disent de ne pas utiliser le NullLayoutManager. Y at-il un moyen de le faire avec le NullLayoutManager, parce que je dois positionner spécifiquement mon JButton dans mon JPanel? Si ce n'est pas possible, y at-il d'autres façons de positionner un composant JComponent à une position x, y? J'ai également googlé cela et NullLayoutManager est ce que le World Wide Web me donne.

code:

JPanel p = new JPanel(){ 

     @Override 
     public void paintComponent(Graphics gr){ 
      Graphics2D g = (Graphics2D) gr; 
      g.setColor(Color.BLACK); 
      g.fillRect(0, 0, 800, 800); 
      g.setFont(titlefont); 
      g.setColor(Color.WHITE); 
      g.drawString("dont steal my game idea plz", 25, 100); 
      g.drawImage(bi, 138, 70, null); 
      repaint(); 
     } 

    }; 
    p.setLayout(null); 





    JButton b = new JButton("PLAY"); 
    b.setLocation(100, 200); 
    b.setFont(ufont); 




    f.add(p); 
    p.add(b); 
+3

Chaque fois que je vois 'repeindre()' l'intérieur de paintComponent et l'utilisation de 'mises en null' je suis un peu malade , comme des ongles sur un tableau noir - pourquoi fais-tu ça? Qui vous enseigne et de nombreux autres débutants ces mauvaises habitudes? S'il vous plaît lire les tutoriels pour voir comment le faire correctement. Et lisez les réponses aux questions similaires des experts Swing sur ce site pour voir aussi comment faire les choses correctement. Tout cela a été demandé et répondu de nombreuses fois auparavant. –

+0

* "mais le bouton ne s'affichera pas tel quel dans le calque CI-DESSOUS les graphiques" * - Non, paintComponent est appelé BEFORE "paintChildren" qui peindrait les composants. Le fait que vous brisiez la chaîne de peinture en n'appelant pas 'super.paintComponent'" pourrait "avoir quelque chose à voir avec cela? – MadProgrammer

+1

' Mais les réponses me disent de ne pas utiliser le NullLayoutManager' - alors pourquoi n'essayez-vous pas d'écouter les réponses??? Pourquoi pensez-vous que nous allons changer la réponse juste parce que vous posez la même question à nouveau ??? 'parce que je dois positionner spécifiquement mon JButton dans mon JPanel? '- utilisez donc un gestionnaire de disposition pour positionner le bouton. Au fait, il n'y a aucune raison de peindre du texte non plus. Vous utilisez simplement un JLabel. Ainsi, un gestionnaire de disposition sera facilement capable de gérer à la fois l'étiquette et le bouton. – camickr

Répondre

1

Est-il possible de le faire avec le NullLayoutManager, parce que je dois placer spécifiquement mon JButton dans mes JPanel?

La réponse est "oui", mais comprenez-vous ce que font réellement les gestionnaires de disposition? Comment ils fonctionnent et le rôle qu'ils remplissent afin de les remplacer et de prendre en charge les exigences de leur fonctionnalité? Les mises en page sont simplement une mauvaise idée, il y a tellement de choses qui peuvent mal avec elles, c'est l'engourdissement de l'esprit juste en essayant d'y penser. Si aucun des gestionnaires de mise en page ne fait ce que vous voulez, peut-être envisager d'utiliser MigLayout ou un autre gestionnaire de mise en page, peut-être même d'écrire le vôtre, au moins de cette façon, vous serez toujours capable de travailler autour des gestionnaires de disposition.

Il y a quelques autres problèmes, d'abord, vous peignez votre image APRÈS la peinture du texte, cela pourrait causer quelques problèmes si les deux se chevauchent. Deuxièmement, vous brisez la chaîne de peinture en n'appelant pas super.paintComponent, cela pourrait entraîner des résultats inattendus et indésirables. Troisièmement, vous n'avez pas besoin de remplir le composant, utilisez setBackground et laissez le super.paintComponent gérer cela.

Play this

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DownWithNullLayouts { 

    public static void main(String[] args) { 
     new DownWithNullLayouts(); 
    } 

    public DownWithNullLayouts() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private Font titlefont; 
     private BufferedImage bi; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.insets = new Insets(30, 0, 0, 0); 
      add(new JButton("Play"), gbc); 
      try { 
       bi = ImageIO.read(...); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
      titlefont = UIManager.getFont("Label.font"); 
      setBackground(Color.BLACK); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int x = (getWidth() - bi.getWidth())/2; 
      int y = (getHeight()- bi.getHeight())/2; 
      g2d.drawImage(bi, x, y, this); 
      g2d.setFont(titlefont); 
      g2d.setColor(Color.WHITE); 
      g2d.drawString("dont steal my game idea plz", 25, 100); 
      g2d.dispose(); 
     } 

    } 

} 

Jetez un oeil de plus près Painting in AWT and Swing et Performing Custom Painting pour plus de détails

+0

Donc ce n'est pas possible? – winterfox

+0

Pour le faire correctement, vous devez avoir une très bonne compréhension du rôle de l'API du gestionnaire de disposition, car vous devrez remplacer cette fonctionnalité.La raison pour laquelle nous décourageons l'utilisation de mises en page nulles est généralement parce que je ne comprends pas ce qu'ils font. Ma recommandation personnelle serait d'écrire un gestionnaire de disposition personnalisé qui a atteint les résultats que vous recherchez – MadProgrammer

+0

Comme ce tutoriel ici: https://docs.oracle.com/javase/tutorial/uiswing/examples/layout/CustomLayoutDemoProject/src/layout /DiagonalLayout.java? – winterfox