我希望能夠動態添加新的60x80圖像,這些圖像將充當按鈕來打開新幀。但是,出於某種奇怪的原因,我的createFrame()方法無法將任何類型的組件添加到jpanel中。我一直試圖解決這個問題幾個小時,現在我不確定有什麼問題。我嘗試添加純色面板,標籤,按鈕......但沒有任何工作。我的主要JPanel將使用FlowLayout來處理所有圖像,而我的主JFrame使用BorderLayout,這樣我可以在後面的主要部分中定位另一個特定內容JPanel。難以從菜單中的圖像/面板/按鈕到JPanel
這裏是我的代碼(包括重新驗證()作爲我的編輯,其中固定它):
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之後,我也不明白它們之間的區別。
'重新驗證()'是一個異步方法。它允許告訴Swing:當你完成處理隊列中的事件(點擊,鼠標等)時,調用'validate()'。 'validate()'是同步的。它立即執行驗證操作。 – 2013-05-12 14:50:45
@JB Nizet啊,很酷。謝謝,這是一個比javadoc更好的解釋。我很感激。 – 2013-05-12 17:31:29