java - 需要在按下 Jbutton 时显示 ImageIcon

标签 java swing jbutton jlabel imageicon

当我单击 Jbutton 时,我无法显示图像,测试 sysoutprint 可以工作,但图像却不能。关于做什么的任何想法我都非常迷失!该图像是学校项目的复活节彩蛋,请随意发表评论。我应该使用除 ImageIcon 之外的其他东西吗? 另外,如果有任何其他错误,请告诉我!

package GUI;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class mainView{
private static JFrame main; //main frame we add everything too
private static JPanel newGame; //panel for new game        
private static JPanel dropDownPanel; //panel for the combobox 

private static CardLayout clayout; //cardlayout for new game
private static JComboBox dropDown; //dropdown combobox  
ImageIcon eastImg;





public void codeNameView(){
    main = new JFrame("CodeNames");
    main.setSize(600, 900);
    main.setVisible(true);

    //dropdown menu for quit and new game
    String[] choice = {" " , "NewGame" , "Quit"};
    dropDown = new JComboBox(choice);

    //below is the panel where we add new game and quit options too
    dropDownPanel = new JPanel();
    dropDownPanel.setSize(100, 100);
    dropDownPanel.add(dropDown);
    main.getContentPane().add(dropDownPanel,BorderLayout.NORTH);

    //easter egg
    JButton easterButt = new JButton("Pass CSE 116");
    JLabel eastLbl = new JLabel();
    //added button to JLabel
    eastLbl.add(easterButt);
    try{
        String path = "/Users/nabeelkhalid/git/s18semesterproject-b4-zigzag1/src/GUI/MatthewPhoto.jpg";
        eastImg = new ImageIcon(path);

    }catch(Exception ex){
        System.out.print(ex);
    }
    //added label to Panel
    dropDownPanel.add(eastLbl);
    eastLbl.addMouseListener(new MouseListener(){

        @Override
        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub
            eastLbl.setIcon(eastImg);
            System.out.print("test");

        }
        //Ignore
        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub

        }

    });

    //action listener for dropdown combobox
    dropDown.addActionListener(new ActionListener(){

      /**
       * Allows for the user to select New Game or Quit and have the game perform said action
       */
        @Override
        public void actionPerformed(ActionEvent e) {

            // TODO Auto-generated method stub
            JComboBox cb = (JComboBox) e.getSource();
            Object selectedOption = dropDown.getSelectedItem();

            if (selectedOption.equals("Quit")) {
                 main.dispose();    
            }else if(selectedOption.equals("NewGame")){

                codeNameView();
                System.out.print("yolo");

            }
                }

    });

}


public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            mainView x = new mainView();

            // create a instance on mainview to run instead of using static methods

        }
    });
}

}

最佳答案

主要问题似乎就在这里

try{
    String path = "/Users/nabeelkhalid/git/s18semesterproject-b4-zigzag1/src/GUI/MatthewPhoto.jpg";
    eastImg = new ImageIcon(path);

}catch(Exception ex){
    System.out.print(ex);
}

该路径引用 src 路径上下文中的资源。您永远不应该在代码中引用 src,一旦程序导出(到 Jar 或在不同的计算机上运行),它就不会存在

相反,您应该考虑使用 Class#getResource 来获取对图像的引用,我个人会使用 ImageIO.read 而不是 ImageIcon > 作为个人喜好。

try{
    String path = "/GUI/MatthewPhoto.jpg";
    eastImg = new ImageIcon(ImageIO.read(this.getClass().getResource(path)));
}catch(Exception ex){
    System.out.print(ex);
}

并且,您的下一个问题是,您尝试将 JLabel 添加到 JButton,预计 JButton 没有布局manager AND JButton 已经支持显示图像,因此,您应该做一些更像...

JButton easterButt = new JButton("Pass CSE 116");
//JLabel eastLbl = new JLabel();
//added button to JLabel
//eastLbl.add(easterButt);
try {
    String path = "/GUI/MatthewPhoto.jpg";
    eastImg = new ImageIcon(ImageIO.read(this.getClass().getResource(path)));

} catch (Exception ex) {
    System.out.print(ex);
}
//added label to Panel
dropDownPanel.add(easterButt);
easterButt.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        easterButt.setIcon(eastImg);
    }
});

你真的应该仔细看看 How to Use Buttons, Check Boxes, and Radio Buttons

测试代码

这是我用来测试上面建议的解决方案的代码

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class mainView {

    private static JFrame main; //main frame we add everything too
    private static JPanel newGame; //panel for new game        
    private static JPanel dropDownPanel; //panel for the combobox 

    private static CardLayout clayout; //cardlayout for new game
    private static JComboBox dropDown; //dropdown combobox  
    ImageIcon eastImg;

    public void codeNameView() {
        main = new JFrame("CodeNames");
        main.setSize(600, 900);

        //dropdown menu for quit and new game
        String[] choice = {" ", "NewGame", "Quit"};
        dropDown = new JComboBox(choice);

        //below is the panel where we add new game and quit options too
        dropDownPanel = new JPanel();
        dropDownPanel.setSize(100, 100);
        dropDownPanel.add(dropDown);
        main.getContentPane().add(dropDownPanel, BorderLayout.NORTH);

        //easter egg
        JButton easterButt = new JButton("Pass CSE 116");
//      JLabel eastLbl = new JLabel();
//      //added button to JLabel
//      eastLbl.add(easterButt);
        try {
            String path = "/GUI/MatthewPhoto.jpg";
            eastImg = new ImageIcon(ImageIO.read(this.getClass().getResource(path)));

        } catch (Exception ex) {
            System.out.print(ex);
        }
        //added label to Panel
        dropDownPanel.add(easterButt);
        easterButt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                easterButt.setIcon(eastImg);
            }
        });

        //action listener for dropdown combobox
        dropDown.addActionListener(new ActionListener() {

            /**
             * Allows for the user to select New Game or Quit and have the game
             * perform said action
             */
            @Override
            public void actionPerformed(ActionEvent e) {

                // TODO Auto-generated method stub
                JComboBox cb = (JComboBox) e.getSource();
                Object selectedOption = dropDown.getSelectedItem();

                if (selectedOption.equals("Quit")) {
                    main.dispose();
                } else if (selectedOption.equals("NewGame")) {

                    codeNameView();
                    System.out.print("yolo");

                }
            }

        });
        main.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello");
                mainView x = new mainView();
                x.codeNameView();
                // create a instance on mainview to run instead of using static methods
            }
        });
    }
}

关于java - 需要在按下 Jbutton 时显示 ImageIcon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49836347/

相关文章:

java - 修改参数的值

java - 如何在 Java 中模拟 Web 服务器以进行单元测试?

java - 单一职责原则和事件监听器

java - 如何将值(数组或数组列表)从一个 Pane 传递到另一个 Pane ?

java - 我不明白为什么我的 ActionListeners 在按下 JButton 时不起作用?

java - 尝试使用 H2 数据库更新 JDBC 结果集时出现异常

java - 测试 Hibernate 映射 : no persistent classes found for query classes

java - 与后端数据结构同步的 JTable 设计

Java swing 边框和 Boxlayout

java - 如何设置 JButton ArrayList 的属性?