我似乎完成了一切。我只需要实现一个简单的JMenuBar
,但它似乎无法正常工作。有人可以帮帮我吗?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class swing {
public static void main (String[] args) {
JFrame frame = new JFrame ("menu");
frame.setVisible (true);
frame.setSize (400, 400);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
JMenuBar bar = new JMenuBar ();
frame.setJMenuBar (bar);
bar.setVisible (true);
JMenu file = new JMenu ("File");
bar.add (file);
JMenuItem open = new JMenuItem ("open");
file.add(open);
}
}
答案 0 :(得分:8)
您正在做的是首先显示框架,然后向其添加菜单栏。不起作用。你应该做反向。最后或至少在设置菜单栏后移动frame.setVisible (true);
行。在向其添加所有组件后应始终显示框架,否则在显示框架后添加的组件将在repaint()
完成后才会显示。
来自@sjr的评论:
有时需要
revalidate
(不仅repaint
)来改变a 容器后面的容器(添加/删除/调整组件) 已经显示。
答案 1 :(得分:3)
试试这个,它有效。
在框架中添加组件在invisible state
中,一旦设置了所有组件,就将其设为可见。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class swing extends JFrame {
public swing(){
this.setSize(400,400);
this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
this.setComponent();
}
public void setComponent(){
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("Menu");
this.setJMenuBar(bar);
bar.add(menu);
}
public static void main (String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
swing s = new swing();
s.setVisible(true);
}
});
}
}