0

我希望能够动态添加新的 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 之后,我也不明白其中的区别。

4

2 回答 2

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如果您不利用它,为什么要进行子类化?

于 2013-05-12T14:56:52.677 回答
0

使用 Image 和 ActionListener 创建动态 JButton - Java Swing

使用 Image 和 ActionListener 动态创建 JButton。您将能够在一处更改按钮的高度、宽度水平间隙和垂直间隙

在此处输入图像描述

我创建了一个虚拟数据库类,它将返回主菜单项和子菜单项。您将在 JFrame 中看到主菜单项。如果您从按钮面板中选择主项目(食物),它将从虚拟数据库类加载子项目(食物的子项目)

您可以从这里找到更多带有图像和源代码的详细信息

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);
}
于 2013-06-26T21:00:01.797 回答