Java 通过单击 JButton 显示图像

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9721421/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 06:43:24  来源:igfitidea点击:

Show image by click JButton

javaeclipseimageswingmodel-view-controller

提问by Ismail

I have a problem. I don't know how to display an image by clicking a JButton.

我有个问题。我不知道如何通过单击 JButton 来显示图像。

I have a class which can show and hide an image:

我有一个可以显示和隐藏图像的类:

/**
 * 
 */
package com.samples;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

/**
 * @author
 *
 */
public class New2 extends JFrame implements ActionListener {

    private static String SHOW_ACTION = "show";
    private static String HIDE_ACTION = "hide";

    private Image image = null;
    private boolean showImage = false;

    public New2(String filename) {
        setTitle("MyWindow");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(800, 600);

        this.image = new ImageIcon("..//src/img/Ster.png").getImage();

        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        container.add(createControls(), BorderLayout.SOUTH);
    }

    private JPanel createControls() {
        JButton showButton = new JButton("Show");
        showButton.addActionListener(this);
        showButton.setActionCommand(SHOW_ACTION);

        JButton hideButton = new JButton("Hide");
        hideButton.addActionListener(this);
        hideButton.setActionCommand(HIDE_ACTION);

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout(FlowLayout.CENTER));

        panel.add(showButton);
        panel.add(hideButton);

        return panel;
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);

        if (showImage) {
            g.drawImage(image, 100, 200, image.getWidth(null), image.getHeight(null), null);
        }
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        String actionCommand = event.getActionCommand();

        if (SHOW_ACTION.equals(actionCommand)) {
            showImage = true;
        } else if (HIDE_ACTION.equals(actionCommand)) {
            showImage = false;
        }

        repaint();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                New2 frame = new New2("resources/image.jpg");
                frame.setVisible(true);
            }
        });
    }
}

I'm working with MVC so I want the code for the JButton in my map for controllers but I don't know how to do this.

我正在使用 MVC,所以我想要控制器地图中 JButton 的代码,但我不知道如何执行此操作。

package View;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


import Controller.HomeController;
import Controller.KeeperController;

public class Selectie extends JFrame{

    private JLabel label, label1, label2;
    private JButton keeper;
    private JPanel panel;
    private Container window = getContentPane();
    private KeeperController controller;


    public Selectie()
    {
        initGUI();

    }

    public void initGUI()
    {
        setLayout(null);
        setTitle();
        setSize(800,600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        label = new JLabel();       
        label.setBounds(0, 0, 266, 800);
        label.setBackground(Color.RED);
        label.setOpaque(true);
        window.add(label);

        label1 = new JLabel();
        label1.setBounds(266, 0, 266, 800);
        label1.setBackground(Color.BLACK);
        label1.setOpaque(true);
        window.add(label1);

        label2 = new JLabel();
        label2.setBounds(532, 0, 266, 800);
        label2.setBackground(Color.RED);
        label2.setOpaque(true);
        window.add(label2);

        keeper = new JButton("1. "+""+" Kenneth Vermeer");
        keeper.setBounds(60, 500, 200, 25);
        keeper.setFocusable(false);
        keeper.setBorderPainted(false);
        keeper.setContentAreaFilled(false);
        keeper.setFont(new Font("Arial",Font.PLAIN,17));
        label.add(keeper);

        }

}

The button keeper needs to show the image when it is clicked.

按钮管理器需要在单击时显示图像。

采纳答案by nIcE cOw

As said likewise, by others, always use JLabelto display images. That way it's easy to add/remove them as an when needed, instead of painting. Moreover, in your code you are overriding paint(...), for Swingwe prefer to override paintComponent(...)method of the respective JComponentif the said component in question has one.

正如其他人所说,总是用于JLabel显示图像。这样就可以在需要时轻松添加/删除它们,而不是绘画。此外,在您的代码中,您正在覆盖paint(...),因为如果有问题的所述组件有一个,Swing我们更喜欢覆盖paintComponent(...)各自的方法JComponent

Here try this code, I had separated the Controller part, you might get some idea, as to how to do things :

在这里试试这个代码,我已经分离了控制器部分,你可能会知道如何做事情:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

/**
 * @author
 *
 */
public class New2 extends JFrame
{

    private static String SHOW_ACTION = "show";
    private static String HIDE_ACTION = "hide";

    public New2(String filename) 
    {
        setTitle("MyWindow");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(800, 600);        

        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        container.add(createControls(), BorderLayout.CENTER);
    }

    private JPanel createControls() 
    {
        JButton showButton = new JButton("Show");        
        showButton.setActionCommand(SHOW_ACTION);

        JButton hideButton = new JButton("Hide");        
        hideButton.setActionCommand(HIDE_ACTION);

        JLabel imageLabel = new JLabel();

        New2Controller n2c = new New2Controller(showButton
                                                                        , hideButton, imageLabel);
        showButton.addActionListener(n2c);          
        hideButton.addActionListener(n2c);  

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout(FlowLayout.CENTER));

        panel.add(imageLabel);
        panel.add(showButton);
        panel.add(hideButton);

        return panel;
    }

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable() 
        {
            @Override
            public void run() 
            {
                New2 frame = new New2("/img/image.jpg");
                frame.setVisible(true);
            }
        });
    }
}

class New2Controller implements ActionListener
{
    private JButton showButton;
    private JButton hideButton;
    private JLabel imageLabel;
    private static String SHOW_ACTION = "show";
    private static String HIDE_ACTION = "hide";
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");

    public New2Controller(JButton show, JButton hide, JLabel label)
    {
        showButton = show;
        hideButton = hide;
        imageLabel = label;
    }

    public void actionPerformed(ActionEvent event)
    {
        String actionCommand = event.getActionCommand();

        if (SHOW_ACTION.equals(actionCommand)) 
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {                       
                    imageLabel.setIcon(infoIcon);
                }
            });
        } 
        else if (HIDE_ACTION.equals(actionCommand)) 
        {
            imageLabel.setIcon(null);
        }
    }
}

This code represents how you read using ImageIOand URL,

此代码表示您如何使用ImageIO和阅读URL

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

import javax.imageio.ImageIO;

/**
?* @author
?*
?*/
public class New2 extends JFrame
{
? ? private static String SHOW_ACTION = "show";
? ? private static String HIDE_ACTION = "hide";

? ? public New2(String filename)?
    {
? ? ? ? setTitle("MyWindow");
? ? ? ? setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
? ? ? ? setSize(800, 600); ? ? ? ?

? ? ? ? Container container = getContentPane();
? ? ? ? container.setLayout(new BorderLayout());
? ? ? ? container.add(createControls(), BorderLayout.CENTER);
? ? }

? ? private JPanel createControls()?
    {
? ? ? ? JButton showButton = new JButton("Show"); ? ? ? ?
? ? ? ? showButton.setActionCommand(SHOW_ACTION);

? ? ? ? JButton hideButton = new JButton("Hide"); ? ? ? ?
? ? ? ? hideButton.setActionCommand(HIDE_ACTION);

        JLabel imageLabel = new JLabel();

        New2Controller n2c = new New2Controller(showButton
                                      , hideButton, imageLabel);
        showButton.addActionListener(n2c);          
        hideButton.addActionListener(n2c);

        JPanel panel = new JPanel();
? ? ? ? panel.setLayout(new FlowLayout(FlowLayout.CENTER));

        panel.add(imageLabel);
? ? ? ? panel.add(showButton);
? ? ? ? panel.add(hideButton);

? ? ? ? return panel;
? ? }

? ? /**
? ? ?* @param args
? ? ?*/
? ? public static void main(String[] args)?
    {
        EventQueue.invokeLater(new Runnable()?
        {
            @Override
            public void run()?
            {
                New2 frame = new New2("/img/image.jpg");  
                frame.setVisible(true);
            }
        });
    }
}

class New2Controller implements ActionListener
{
    private JButton showButton;
    private JButton hideButton;
    private JLabel imageLabel;
    private Image image;
    private ImageIcon imageIcon;
    private static String SHOW_ACTION = "show";
? ? private static String HIDE_ACTION = "hide";

    public New2Controller(JButton show, JButton hide, JLabel label)
    {
        showButton = show;
        hideButton = hide;
        imageLabel = label;
        try
        {
            image = ImageIO.read(getClass().getResource("/img/caIcon.png"));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        imageIcon = new ImageIcon(image);
    }

    public void actionPerformed(ActionEvent event)
    {
        String actionCommand = event.getActionCommand();

? ? ? ? if (SHOW_ACTION.equals(actionCommand))?
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {                       
                    imageLabel.setIcon(imageIcon );
                }
            });
        }?
        else if (HIDE_ACTION.equals(actionCommand))?
        {
            imageLabel.setIcon(null);
? ? ? ? }
    }
}

Moreover, when you are using BorderLayoutnever use NORTH, EAST, WESTand SOUTHfor BorderLayout. They have been replaced with PAGE_START, LINE_START, LINE_ENDand PAGE_ENDrespectively.

此外,当您使用BorderLayout从未使用NORTHEASTWESTSOUTH为BorderLayout的。他们已被替换PAGE_STARTLINE_STARTLINE_ENDPAGE_END分别。

A BorderLayout object has five areas. These areas are specified by the BorderLayout constants:

BorderLayout 对象有五个区域。这些区域由 BorderLayout 常量指定:

  • PAGE_START
  • PAGE_END
  • LINESTART
  • LINE_END
  • CENTER
  • PAGE_START
  • PAGE_END
  • LINESTART
  • LINE_END
  • 中央

Version note: Before JDK release 1.4, the preferred names for the various areas were different, ranging from points of the compass (for example, BorderLayout.NORTH for the top area) to wordier versions of the constants we use in our examples. The constants our examples use are preferred because they are standard and enable programs to adjust to languages that have different orientations.

版本说明:在 JDK 1.4 版之前,各个区域的首选名称是不同的,从罗盘的点(例如,顶部区域的 BorderLayout.NORTH)到我们在示例中使用的常量的更冗长的版本。我们的示例使用的常量是首选的,因为它们是标准的并且使程序能够适应具有不同方向的语言。

Directory Structure :

目录结构:

                                Your Project
                                |          | 
                              classes     src 
                              |     |
                             img  *.class(or package Folder)  

Now use getClass().getResource("/img/star.png");

现在使用 getClass().getResource("/img/star.png");

回答by Rahul Borkar

You can simply add a JLable to show image on it. After this, you can setVisible JLabel depending on condition.

您可以简单地添加一个 JLable 来在其上显示图像。在此之后,您可以根据条件设置Visible JLabel。

回答by mKorbel

1) use JLabel#setIcon()instead of painting image as background to the JFrame

1) 使用JLabel#setIcon()而不是将图像绘制为JFrame 的背景

2) create methods into class Selectie

2)创建方法进入 class Selectie

private void setIconToLabel (Icon icon){

     myDesiredLabel.setIcon(icon);
}

3) don't create a new JFramefor another image use CardLayoutinstaed

3) 不要为另一个图像创建一个新的JFrame使用CardLayoutinstaed