2017-04-30 4 views
-2

J'écris ce programme qui crée une conception H-Tree partout où vous cliquez, et je suis censé implémenter un JMenuBar afin que je puisse changer la couleur du dessin récursif. Pour une raison quelconque, il n'apparaît pas, peu importe ce que je fais.Pourquoi mon JMenuBar n'apparaît-il pas?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

@SuppressWarnings("serial") class Echo extends JFrame implements ActionListener, MouseListener, ChangeListener{ 

    private static final int SLIDER_MIN = 1; 
    private static final int SLIDER_MAX = 11; 
    private static final int SLIDER_INIT = 1; 
    private int x; 
    private int y; 
    private int rec = SLIDER_INIT; 

    private Echo() { 
     super("H-Tree Drawing Pad"); 

     Container canvas = this.getContentPane(); 

     addMenus(); 
     canvas.add(createSlider(), BorderLayout.SOUTH); 


     this.setSize(800,800); 
     this.setVisible(true); 
     this.setLocation(200, 200); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     this.addMouseListener(this); 

    } 

    private void addMenus() { 
     JMenuBar menuBar = new JMenuBar(); 
     this.setJMenuBar(menuBar); 

     JMenu menuColor = new JMenu("Color"); 
     menuBar.add(menuColor); 

     JMenuItem mitToBlack = new JMenuItem("Black"); 
     mitToBlack.addActionListener(new ColorListener()); 
     menuColor.add(mitToBlack); 

     JMenuItem mitToBlue = new JMenuItem("Blue"); 
     mitToBlue.addActionListener(new ColorListener()); 
     menuColor.add(mitToBlue); 

     JMenuItem mitToRed = new JMenuItem("Red"); 
     mitToRed.addActionListener(new ColorListener()); 
     menuColor.add(mitToRed); 

     JMenuItem mitToGreen = new JMenuItem("Green"); 
     mitToGreen.addActionListener(new ColorListener()); 
     menuColor.add(mitToGreen); 
    } 

    private JPanel createSlider() { 
     JPanel slider = new JPanel(new BorderLayout()); 
     JSlider electricSlide = new JSlider(JSlider.HORIZONTAL,SLIDER_MIN, SLIDER_MAX, SLIDER_INIT); 

     electricSlide.addChangeListener(this); 

     electricSlide.setMajorTickSpacing(2); 
     electricSlide.setMinorTickSpacing(1); 
     electricSlide.setPaintTicks(true); 
     electricSlide.setPaintLabels(true); 
     electricSlide.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); 
     slider.add(electricSlide); 
     return slider; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Echo(); 
      } 
     }); 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     x = e.getX(); 
     y = e.getY(); 

     repaint(); 

    } 

    @Override 
    public void paint(Graphics g) { 
     g.setColor(Color.BLACK); 
     drawOrder(this.getRec(),x,y,95,g); 

    } 

    private void drawHTree(int x, int y, int size, Graphics g) { 
     g.drawLine(x, y, x, y + size); 
     g.drawLine(x + size, y, x + size, y + size); 
     g.drawLine(x, y + size/2, x + size, y + size/2); 

    } 

    private void drawOrder(int initiative, int x, int y, int size, Graphics g) { 
     this.drawHTree(x, y, size, g); 
     if(initiative > 1) { 
      this.drawOrder(initiative - 1, x - size/4, y - size/4, size/2, g); 
      this.drawOrder(initiative - 1, x+size - size/4, y-size/4, size/2, g); 
      this.drawOrder(initiative -1, x-size/4, y+size-size/4, size/2, g); 
      this.drawOrder(initiative - 1, x+size-size/4, y+size-size/4, size/2, g); 
     } 
    } 

    @Override 
    public void stateChanged(ChangeEvent e) { 
     JSlider origin = (JSlider)e.getSource(); 
     if(!origin.getValueIsAdjusting()) { 
      setRec((int)origin.getValue()); 
     } 

    } 

    public int getRec() { 

     return rec ; 
    } 

    public void setRec(int rec) { 
     this.rec = rec; 
    } 

    private class ColorListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 


     } 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 



} 

Répondre

2

Vous avez remplacée la méthode de peinture de votre JFrame et ne pas appeler la méthode de super à l'intérieur, brisant la chaîne de peinture.

par exemple, vous manquez ceci:

@Override 
public void paint(Graphics g) { 
    super.paint(g); // ****** you're missing this *** 
    g.setColor(Color.BLACK); 
    drawOrder(this.getRec(), x, y, 95, g); 
} 

En n'appelant la méthode de peinture de super votre code empêche maintenant les composants enfants du JFrame, y compris la barre de menus, de la peinture correctement. Cela dit, en fait vous ne devriez jamais peindre directement dans un JFrame mais plutôt dans un paintComponent de JPanel et même là vous devriez appeler la méthode de peinture du super, ici super.paintComponent(g);.