JMenuBar在应用程序的单独窗口中打开

时间:2015-01-19 02:45:57

标签: java swing jmenubar

使用打开窗口并允许用户在窗口上绘制的Java应用程序,如画布。

我刚刚添加了JMenuBar,最终将允许用户使用不同的绘图工具。问题是JMenuBar在"画布"的单独窗口中打开。窗口,我希望JMenuBar成为同一窗口的一部分。

我如何解决这个问题并实现这一目标?

这是创建菜单栏的方法:

// Create JFrame with MenuBar Components
public static void initializeMenu() {
    frame = new JFrame();

    // JMenu Bar
    menuBar = new JMenuBar();
    menuBar.setBackground(Color.GRAY);

    // JMenu
    fileMenu = new JMenu("File");
    editMenu = new JMenu("Edit");
    menuBar.add(fileMenu);
    menuBar.add(editMenu);

    // JMenu Items
    jItem = new JMenuItem("Save");
    fileMenu.add(jItem);

    // Make JMenuBar Visible in Application
    frame.setJMenuBar(menuBar);
    frame.pack();
    frame.setVisible(true);

}

主要方法:

// Main method
    public static void main(String[] args) {
        Paint paint = new Paint();
        paint.setSize(800, 500);
        paint.setVisible(true);
        paint.setLayout(new FlowLayout());
        initializeMenu();

    }

1 个答案:

答案 0 :(得分:1)

尝试从JMenuBar返回initializeMenu的实例,并将其应用于Paint

public static JMenuBar initializeMenu() {
    // JMenu Bar
    menuBar = new JMenuBar();
    menuBar.setBackground(Color.GRAY);

    // JMenu
    fileMenu = new JMenu("File");
    editMenu = new JMenu("Edit");
    menuBar.add(fileMenu);
    menuBar.add(editMenu);

    // JMenu Items
    jItem = new JMenuItem("Save");
    fileMenu.add(jItem);

    return menuBar;    
}

然后将其应用于Paint班级......

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Paint paint = new Paint();
            paint.setJMenuBar(initializeMenu());        
            paint.setLayout(new FlowLayout());
            paint.setSize(800, 500);
            paint.setVisible(true);
        }
    });
}

就个人而言,我赞成pack超过setSize,它通常会产生一个可视区域,可以满足您的需求(假设您正确使用布局管理API)

<强>更新...

你已经打破了油漆链

public class Paint extends JFrame implements ... {

    //...

    // Method for different drawing stencils
    public void paint(Graphics g) {
        if (p != null) {
            g.setColor(c);
            switch (shapeType) {
                case 0:
                    g.drawOval(p.x - w / 2, p.y - h / 2, w, h);
                    break;
                case 1:
                    g.drawRect(p.x - w / 2, p.y - h / 2, w, h);
                    break;

            }

        }

        // Resets application window surface to white (clears the canvas)
        if (Refresh == true) {
            g.setColor(Color.white);
            g.fillRect(0, 0, 1500, 1500);

        }
        g.drawImage(key, 0, 0, this);

        if (widthincrease == true) {
            w += 1;
        }
        if (heightincrease == true) {
            h += 1;
        }
        if (widthdecrease == true) {
            w -= 1;

            if (w < 1) {
                w = 50;
            }
        }

        if (heightdecrease == true) {
            h -= 1;

            if (h < 1) {
                h = 50;
            }
        }

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        repaint();
    }

    public void update(Graphics g) {
        paint(g);
    }
}

基本上,通过覆盖paint,但从不致电super.paint,您已经阻止了该框架的内容。

首先,你应该避免覆盖paint顶级容器,这只是一个例子,但是JFrame有许多其他组件位于它顶部。

RootPane

这些可以(并且将会)绘制在您尝试绘制到框架上的任何内容。

框架有边框,在框架区域内绘画,通过覆盖paint,您可以在这些边框下绘画,请参阅How to get the EXACT middle of a screen, even when re-sized以获取我正在谈论的内容的示例。

相反,创建一个从JPanel延伸并覆盖它的paintComponent方法的自定义类,移动其余的&#34;绘画&#34;与此课程的代码相关(并且在进行任何自定义绘画之前不要忘记调用super.paintComponent)。

有关详细信息,请参阅Performing Custom Painting

避免使用KeyListener,严肃地说,它只是一个画图,而是使用键绑定API,有关详细信息,请参阅How to Use Key Bindings