gpt4 book ai didi

java - JMenuBar 在与应用程序分开的窗口中打开

转载 作者:行者123 更新时间:2023-12-01 12:00:25 26 4
gpt4 key购买 nike

开发一个 Java 应用程序,该应用程序打开一个窗口并允许用户在窗口上绘图,就像 Canvas 一样。

我刚刚添加了一个JMenuBar,最终将允许用户使用不同的绘图工具。问题是 JMenuBar 在与“canvas”窗口不同的窗口中打开,并且我希望 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();

}

最佳答案

尝试从 initializeMenu 返回 JMenuBar 实例并将其应用到 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方法,移动与此类代码相关的其余“绘画”(并且不要'在进行任何自定义绘画之前,不要忘记调用 super.paintComponent)。

参见Performing Custom Painting了解更多详情

避免使用KeyListener,说真的,它只是一种绘画,而是使用按键绑定(bind)API,请参阅How to Use Key Bindings了解更多详情

关于java - JMenuBar 在与应用程序分开的窗口中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28017247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com