我希望能够动态添加新的60x80图像,这些图像将充当打开新帧的按钮。但是,由于某些奇怪的原因,我的createFrame()方法无法将任何类型的组件添加到jpanel中。我一直试图解决这个问题几个小时,我不确定是什么问题。我尝试过添加普通面板,标签,按钮......但没有任何效果。我的主要JPanel将对所有图像使用FlowLayout,而我的主JFrame使用BorderLayout,这样我可以在以后的主要内容下放置另一个特定内容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之后我也不明白它的区别。
答案 0 :(得分:1)
也许您可以澄清,但您已声明class TestIt extends JFrame
因此您在构造函数中不需要main_frame = new JFrame("Test Program");
。
它可以被这样的东西取代:
public testIt() {
super("Test Program");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(500, 500);
// whatever code goes here such as...
// this.add(somePanel);
// this.add(new JButton("Click Me!"));
// etc..
this.setVisible(true);
this.pack();
}
除非有明确的框架原因。另外你没有错,你只是采取不同的方式,但我提出它的原因是因为如果你不利用它,为什么子类JFrame
?
答案 1 :(得分:0)
使用Image和ActionListener创建动态JButton - Java Swing
使用Image和ActionListener动态创建JButton。您将能够在一个地方更改按钮高度,宽度水平间隙和垂直间隙。
我创建了虚拟数据库类,它将返回主菜单项和子菜单项。您将在JFrame中看到主菜单项。如果从按钮面板中选择主项目(FOOD),它将从虚拟数据库类(FOOD的子项)加载子项目
you can find more details with images and source Code from here
private void addMainMenue() {
pnl_button.removeAll();
repaint();
Image img, sub;
ImageIcon icon;
String imagePath, imag = "/com/images/";
ArrayList menue = new ArrayList();
ArrayList itemName = new ArrayList();
for (int size = 0; size < ItemDB.mainMenuCodes.length; size++) {
menue.add(ItemDB.mainMenuCodes[size]);
itemName.add(ItemDB.mainMenuDesc[size]);
}
JButton[] buttons = new JButton[menue.size()];
for (int i = 0; i < buttons.length; i++) {
imagePath = imag + menue.get(i).toString() + ".jpeg";
URL url = getClass().getResource(imagePath);
// System.out.println(imagePath +" Get Res : "
// +getClass().getResource(imagePath));
if (url != null) {
img = Toolkit.getDefaultToolkit().getImage(url);
sub = img.getScaledInstance(button_width - 8,
button_height - 30, Image.SCALE_FAST);
icon = new ImageIcon(sub);
} else
icon = new ImageIcon();
buttons[i] = new JButton(itemName.get(i).toString(), icon);
buttons[i].setVerticalTextPosition(AbstractButton.BOTTOM);
buttons[i].setHorizontalTextPosition(AbstractButton.CENTER);
buttons[i]
.setBorder(javax.swing.BorderFactory.createEtchedBorder());
buttons[i].setFont(new java.awt.Font("Tahoma", 1, 13));
buttons[i].setForeground(new java.awt.Color(0, 51, 255));
buttons[i].setActionCommand(menue.get(i).toString());
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String choice = e.getActionCommand();
addSubmenue(choice);
}
});
}
int b = 0;
int vGap = verticalGap;
int hGap = horizontalGap;
int bLength = buttons.length;
int bRows = bLength / numberOfColumns + 1;
L1: for (int j = 0; j < bRows; j++) {
vGap = 10;
for (int k = 0; k < numberOfColumns; k++) {
pnl_button.add(buttons[b],
new org.netbeans.lib.awtextra.AbsoluteConstraints(vGap,
hGap, button_width, button_height));
repaint();
vGap += button_width + verticalGap;
b++;
if (b >= bLength) {
break L1;
}
}
hGap += button_height + horizontalGap;
}
pack();
}
private void addSubmenue(String choice) {
pnl_button.removeAll();
repaint();
Image img, sub;
ImageIcon icon;
String imagePath, imag = "/com/images/";
ArrayList menue = new ArrayList();
ArrayList itemName = new ArrayList();
ArrayList list = ItemDB.getSubMenu(choice);
String subCode[] = (String[]) list.get(0);
String subDesc[] = (String[]) list.get(1);
for (int size = 0; size < subCode.length; size++) {
menue.add(subCode[size]);
itemName.add(subDesc[size]);
}
JButton[] buttons = new JButton[menue.size()];
for (int i = 0; i < buttons.length; i++) {
imagePath = imag + menue.get(i).toString() + ".jpeg";
URL url = getClass().getResource(imagePath);
// System.out.println(imagePath +" Get Reso : "
// +getClass().getResource(imagePath));
if (url != null) {
img = Toolkit.getDefaultToolkit().getImage(url);
sub = img.getScaledInstance(button_width - 8,
button_height - 30, Image.SCALE_FAST);
icon = new ImageIcon(sub);
} else
icon = new ImageIcon();
buttons[i] = new JButton(itemName.get(i).toString(), icon);
buttons[i].setVerticalTextPosition(AbstractButton.BOTTOM);
buttons[i].setHorizontalTextPosition(AbstractButton.CENTER);
buttons[i]
.setBorder(javax.swing.BorderFactory.createEtchedBorder());
buttons[i].setFont(new java.awt.Font("Tahoma", 1, 13));
buttons[i].setForeground(new java.awt.Color(0, 51, 255));
buttons[i].setActionCommand(menue.get(i).toString());
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String choice = e.getActionCommand();
addItems(choice);
}
});
}
int b = 0;
int vGap = verticalGap;
int hGap = horizontalGap;
int bLength = buttons.length;
int bRows = bLength / numberOfColumns + 1;
L1: for (int j = 0; j < bRows; j++) {
vGap = 10;
for (int k = 0; k < numberOfColumns; k++) {
pnl_button.add(buttons[b],
new org.netbeans.lib.awtextra.AbsoluteConstraints(vGap,
hGap, button_width, button_height));
repaint();
vGap += button_width + verticalGap;
b++;
if (b >= bLength) {
break L1;
}
}
hGap += button_height + horizontalGap;
}
pack();
}
private void addItems(String choice) {
if (choice.equals("P"))
choice = "PIZZA";
else if (choice.equals("B"))
choice = "BURGER";
else if (choice.equals("FJ"))
choice = "FRUIT JUICE";
else if (choice.equals("HB"))
choice = "HOT BEVERAGES";
JOptionPane.showMessageDialog(this, "You have select " + choice);
}