如何包装JFrame以使其适合我的所有按钮并将事件监听器附加到Java中的这些按钮?

时间:2013-10-15 19:56:33

标签: java swing button resize jframe

我有以下代码,其中我为每个字母表创建按钮,我想要听哪个字母被点击。我创建了按钮。但我有两个问题,按钮溢出框架,我必须手动调整框架大小以查看所有按钮。我使用setSize for JFrame,但它仍然不符合我的预期。

我还希望将eventlistner附加到每个按钮,因为我点击它们并在点击时获取按钮名称(字母)。

import javax.swing.*;

import java.awt.GridLayout;
import java.awt.event.*;

public class HangmanGUI {


        public static void main(String[] args){

            new HangmanGUI();

        }
        //constructor for Hangman
        /**
         * Instantiates a new hangman gui.
         */
        public HangmanGUI() {

            JFrame myframe= new JFrame();
            JPanel myPanel = new JPanel();

            myframe.setSize(600,400);

            for (char alphabet = 'A';alphabet<='Z';alphabet++){
                myPanel.add(new JButton(alphabet+""));
            }

            myframe.add(myPanel);
            myframe.pack();
            myframe.setTitle("Hangman Game");
            myframe.setVisible(true);
            myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        }

}

这里有任何其他更好的方式或一些不好的风格 - 请指出。万分感谢

2 个答案:

答案 0 :(得分:3)

  

按钮溢出框架,

JPanel的默认布局管理器是FlowLayout,因此按钮从面板流出。

而是使用GridLayout,以便您可以控制每行显示的按钮数量。

  

我使用了setSize for JFrame,但它仍然不符合我的预期。

pack()撤消setSize()。最好使用pack()而不是setSize(),让布局管理器完成它们的工作。

答案 1 :(得分:0)

  

我还希望将eventlistner附加到每个按钮,就像我制作它们一样   单击时获取按钮名称(字母)。

如果所有按钮的行为都相同,那么按如下方式实施一个ActionListener

ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() instanceof JButton){
            JButton pressedButton = (JButton) e.getSource();
            String buttonsName = pressedButton.getName();
            String buttonsText = pressedButton.getText();
            // do something with those
        }
    }
};

JButton a = new JButton("A");
a.addActionListener(actionListener);
JButton b = new JButton("B");
b.addActionListener(actionListener);
....

注意:建议阅读:EventObject.getSource()