2017-04-30 4 views
-2

Ich schreibe dieses Programm, das ein H-Tree-Design erstellt, wo immer Sie klicken, und ich sollte eine JMenuBar implementieren, damit ich die Farbe der rekursiven Zeichnung ändern kann. Aus irgendeinem Grund taucht es nicht auf, egal was ich mache.Warum erscheint meine JMenuBar nicht?

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 

    } 



} 

Antwort

2

Sie haben die Farbe Methode Ihrer JFrame außer Kraft gesetzt und rufen Sie nicht die Methode der Super in ihm, brechen die Malerei Kette.

zum Beispiel sind Sie nicht dieses:

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

Durch den Verzicht auf die Super-Malerei Methode Code ruft nun die JFrame Kinder Komponenten zu verhindern, einschließlich der Menüleiste von richtig zu malen.

In der Tat sollten Sie nie direkt in einem JFrame malen, sondern in einem JPanel paintComponent und selbst dort sollten Sie die Malmethode des Super, hier aufrufen.

Verwandte Themen