在JButton中继承类

时间:2017-04-29 12:17:03

标签: java swing inheritance jbutton

你好,我有一个为我的项目编写java代码的问题,因为我无法解决这个问题,我想要我的"类别"按钮执行动作,它应该显示面包类,但我无法继承它并在上面放一张照片所以这里的任何人都可以告诉我它是什么问题.. 这是代码:

   JButton b1  = new JButton("Categories");
   b1.setSize(120,25);
   b1.setLocation(130,650);
   b1.setBackground(Color.LIGHT_GRAY) ;
   b1.addActionListener(new AL());
   f.add(b1);
   public class AL implements ActionListener{

     public void actionPerformed(ActionEvent ae){
       JFrame f3 = new JFrame("Delicious Bakery");
       f3.setVisible(true);
       f3.setSize(400,200);

       f3.add(Bread);

现在这是Bread类:

  public class Bread extends AL implements ActionListener
{

 Bread() 
 {         

    ImageIcon BreadImage = new ImageIcon("C:\\Users\\Baba\\Downloads\\Documents\\Bread1.jpg");
    JButton Bread = new JButton("Bread",BreadImage);
    Bread.setSize(128,96);


}}

1 个答案:

答案 0 :(得分:4)

你似乎犯了几个基本的错误,包括看起来试图将一个实现ActionListener的类添加到你的GUI,就好像它是一个按钮,但事实并非如此。这表明,通过JButton TutorialActionListener Tutorial的首次阅读,您将获益匪浅。

请注意,如果这是我的项目,我会使用AbstractActions一个类似于“类固醇上的ActionListener”的概念。您可以使用此Action设置JButton,并在此过程中,获取按钮的名称文本,图标和ActionListener行为。

关于您的代码的一些注意事项:

JButton b1  = new JButton("Categories"); // (1)
b1.setSize(120,25); // (2)
b1.setLocation(130,650); // (3)
b1.setBackground(Color.LIGHT_GRAY) ;
b1.addActionListener(new AL()); // (4)
f.add(b1); // (5)
  1. 您在这里创建一个带有String name text
  2. 的JButton
  3. 在这里,您尝试设置绝对大小,我们不建议这样做,并使用空布局导致严格难以改进和调试程序
  4. 设置位置相同
  5. 您似乎正在添加ActionListener确定
  6. 然后将您的按钮添加到容器(也许是JFrame)?
  7. public class AL implements ActionListener{  // (6)
        public void actionPerformed(ActionEvent ae){
            JFrame f3 = new JFrame("Delicious Bakery"); // (7)
            f3.setVisible(true);  // (8)
            f3.setSize(400,200); // (9)
            f3.add(Bread);   // (10)
    
    1. 好的,所以AL类实现了ActionListener并且有一个actionPerformed方法,到目前为止一直很好
    2. 好的,所以你在里面创建一个新的JFrame,有点不寻常,因为大多数GUI只有一个 JFrame
    3. 您在添加组件之前在JFrame上调用setVisible(true) - 而不是代码,因为这有时可能不允许JFrame完全呈现在调用此setVisible之后添加的组件
    4. 与之前有关设置尺寸的相同说明
    5. 现在您将面包添加到JFrame。但Bread看起来不是一个组件,而只是一个ActionListener。这行不应该编译。
    6. public class Bread extends AL implements ActionListener { // (11)
      
          Bread() {    
              // (12)
              ImageIcon BreadImage = new ImageIcon("C:\\Users\\Baba\\Downloads\\Documents\\Bread1.jpg");
              JButton Bread = new JButton("Bread",BreadImage); // (13)
              Bread.setSize(128,96);  // (14)
          }
      }
      
      1. 您的Bread类扩展了AL,但也实现了ActionListener,这是多余的,因为AL已经实现了ActionListener。
      2. 您正在使用文件和绝对路径创建图像图标,轻微禁止使用。更好地使用资源和绝对路径
      3. 好的,你创建一个新的JButton,但你给它的名字与非JButton类相同 - 非常令人困惑。只需这样做。的自从即可。使用唯一名称命名字段,并遵守Java命名问题。
      4. 有关设置尺寸的相同问题。
      5. 例如:

        import java.awt.Dimension;
        import java.awt.event.ActionEvent;
        import java.awt.event.KeyEvent;
        import java.awt.image.BufferedImage;
        import java.io.IOException;
        import java.net.URL;
        
        import javax.imageio.ImageIO;
        import javax.swing.*;
        
        public class TestBread extends JPanel {
            // String to url for bread image
            private static final String BREAD_IMG_PATH = "http://findicons.com/files/icons/339/"
                    + "coffee_break/128/sliced_bread.png";
            // preferred size of jpanel
            private static final int PREF_W = 400;
            private static final int PREF_H = 300;
            private BreadAction breadAction; // our abstract action
            private JButton breadButton; // our jbutton
        
            public TestBread() {
                Icon breadIcon = null;
                try {
                    // get image and put into Icon
                    URL breadUrl = new URL(BREAD_IMG_PATH);
                    BufferedImage breadImg = ImageIO.read(breadUrl);
                    breadIcon = new ImageIcon(breadImg);
                } catch (IOException e) {
                    e.printStackTrace();
                    System.exit(-1);
                }
        
                breadAction = new BreadAction("Bread", KeyEvent.VK_B, breadIcon); // create Action
                breadButton = new JButton(breadAction); // create button with Action
                breadButton.setVerticalTextPosition(AbstractButton.BOTTOM); // position text
                breadButton.setHorizontalTextPosition(SwingConstants.CENTER);
        
                add(breadButton);
            }
        
            @Override
            public Dimension getPreferredSize() {
                if (isPreferredSizeSet()) {
                    return super.getPreferredSize();
                }
                return new Dimension(PREF_W, PREF_H);
            }
        
            private static void createAndShowGui() {
                TestBread mainPanel = new TestBread();
        
                JFrame frame = new JFrame("TestBread");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(mainPanel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        
            public static void main(String[] args) {
                SwingUtilities.invokeLater(() -> createAndShowGui());
            }
        }
        

        我们的AbstractAction或“超级”ActionListener

        @SuppressWarnings("serial")
        class BreadAction extends AbstractAction {
            public BreadAction(String name, int mnemonic, Icon icon) {
                super(name);
                putValue(MNEMONIC_KEY, mnemonic);
                putValue(LARGE_ICON_KEY, icon);
            }
        
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("bread pressed");
            }
        }