使用打开窗口并允许用户在窗口上绘制的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();
}
答案 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
有许多其他组件位于它顶部。
这些可以(并且将会)绘制在您尝试绘制到框架上的任何内容。
框架有边框,在框架区域内绘画,通过覆盖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