2017-04-30 2 views
-2

클릭 할 때마다 H-Tree 디자인을 만드는이 프로그램을 작성 중이며 재귀 그림의 색상을 변경할 수 있도록 JMenuBar를 구현한다고 가정합니다. 웬일인지 내가하는 것에 상관없이 그것이 나타나지 않고있다.JMenuBar가 표시되지 않는 이유는 무엇입니까?

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 

    } 



} 

답변

2

당신은 JFrame의 paint 메소드를 오버라이드했고 그 안에 super 메소드를 호출하지 않았으므로 페인팅 체인을 끊습니다.

예를 들어, 당신이 놓친 :

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

을 코드가 올바르게 그림에서, 자사의 메뉴 모음을 포함하여 JFrame의의 하위 구성 요소를 방해하는 슈퍼의 그림 방법을 호출하지 않음으로써.

사실, JFrame에는 직접 페인트하지 말고 JPanel의 paintComponent에 페인트해야합니다. 심지어 거기에는 super 그림 메서드 (여기서는 super.paintComponent(g);)를 호출해야합니다.

관련 문제