我希望能够动态添加新的 60x80 图像,这些图像将充当打开新框架的按钮。但是,由于某些奇怪的原因,我的 createFrame() 方法无法将任何类型的组件添加到 jpanel 中。我已经尝试解决这个问题几个小时了,但我不确定出了什么问题。我尝试添加普通面板、标签、按钮……但没有任何效果。我的主 JPanel 将对所有图像使用 FlowLayout,而我的主 JFrame 使用 BorderLayout,这样我以后可以将另一个特定内容 JPanel 放置在主 JPanel 下。
这是我的代码(包括我编辑时的 revalidate() ,已修复它):
package testit;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.border.LineBorder;
class TestIt extends JFrame implements ActionListener {
//Main window frame and content panel
private JFrame main_frame;
private JPanel main_panel;
//Screen size variable
private Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
public TestIt() {
//Set up the main frame
main_frame = new JFrame("Test Program");
main_frame.setLayout(new BorderLayout());
main_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main_frame.setIconImage(
new ImageIcon("src/testit/resources/img/app_icon.gif").getImage());
//Set up the inner content panel
main_panel = new JPanel();
main_panel.setLayout(new FlowLayout());
main_panel.setPreferredSize(
new Dimension((screen.width / 10) * 6,(screen.height / 10) * 6));
//Add the menu bar and the main panel to the main frame
main_frame.add(main_panel, BorderLayout.CENTER);
main_frame.setJMenuBar(createMenuBar());
//Display the main GUI
main_frame.pack();
main_frame.setLocationRelativeTo(null);
main_frame.setVisible(true);
}
//Create an instance of the program
private static void runIt() {
TestIt program = new TestIt();
}
private JMenuBar createMenuBar() {
//Create the top menu bar
JMenuBar top_menu_bar = new JMenuBar();
//Create the menu
JMenu main_menu = new JMenu ("Menu");
main_menu.setMnemonic(KeyEvent.VK_M);
top_menu_bar.add(main_menu);
//Create the menu items and add them to the menu
JMenuItem menu_item;
menu_item = new JMenuItem("Add New");
menu_item.setMnemonic(KeyEvent.VK_N);
menu_item.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK));
menu_item.setActionCommand("new");
menu_item.addActionListener(this);
main_menu.add(menu_item);
menu_item = new JMenuItem("Save");
menu_item.setMnemonic(KeyEvent.VK_S);
menu_item.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
menu_item.setActionCommand("save");
menu_item.addActionListener(this);
main_menu.add(menu_item);
menu_item = new JMenuItem("Exit");
menu_item.setMnemonic(KeyEvent.VK_X);
menu_item.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
menu_item.setActionCommand("exit");
menu_item.addActionListener(this);
main_menu.add(menu_item);
//Return the assembled menu bar
return top_menu_bar;
}
public void actionPerformed(ActionEvent e) {
if("new".equals(e.getActionCommand())) {
createFrame();
} else if("save".equals(e.getActionCommand())) {
//save();
} else {
quit();
}
}
private void createFrame() {
/*
ImageIcon image = new ImageIcon("src/testit/resources/img/test.gif");
JLabel label = new JLabel("", image, JLabel.CENTER);
main_panel.add(label);
*/
JButton frame = new JButton("test");
frame.setBorder(new LineBorder(Color.BLACK));
frame.setPreferredSize(new Dimension(60, 80));
frame.setVisible(true);
main_panel.add(frame);
main_frame.revalidate();
}
private void quit() {
System.exit(0);
}
public static void main(String [] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
runIt();
}
});
}
}
任何想法我的代码中的错误是什么?
编辑: 我能够通过使用 main_frame.revalidate() 来修复它......这是最合适的方式吗?使用 validate() 似乎完成了同样的事情,但不幸的是,即使在阅读了 javadoc 之后,我也不明白其中的区别。