Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的JMenuBar没有出现?_Java_Swing_Jframe_Jmenubar - Fatal编程技术网

Java 为什么我的JMenuBar没有出现?

Java 为什么我的JMenuBar没有出现?,java,swing,jframe,jmenubar,Java,Swing,Jframe,Jmenubar,我正在编写这个程序,在你点击的任何地方创建一个H树设计,我应该实现一个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.Action

我正在编写这个程序,在你点击的任何地方创建一个H树设计,我应该实现一个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

    }



}

您已经覆盖了JFrame的绘制方法,并且没有在其中调用super的方法,从而打破了绘制链

e、 g.你错过了这个:

@Override
public void paint(Graphics g) {
    super.paint(g);  // ****** you're missing this ***
    g.setColor(Color.BLACK);
    drawOrder(this.getRec(), x, y, 95, g);
}
通过不调用super的绘制方法,您的代码现在阻止了JFrame的子组件(包括其菜单栏)正确绘制

话虽如此,实际上你不应该直接在JFrame中绘制,而应该在JPanel的paintComponent中绘制,即使在那里你也应该调用super的绘制方法,这里
super.paintComponent(g)