简体   繁体   English

通过单击JButton显示图像

[英]Show image by click JButton

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. 单击按钮保持器时需要显示图像。

As said likewise, by others, always use JLabel to display images. 就像其他人一样,总是使用JLabel来显示图像。 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 Swing we prefer to override paintComponent(...) method of the respective JComponent if the said component in question has one. 此外,在您的代码中您要覆盖paint(...) ,对于Swing ,如果所讨论的组件中有一个组件,我们希望覆盖各自JComponent paintComponent(...)方法。

Here try this code, I had separated the Controller part, you might get some idea, as to how to do things : 在这里尝试这段代码,我已经分离了Controller部分,您可能对如何做事有一些了解:

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 ImageIO and URL , 此代码表示您如何使用ImageIOURL阅读,

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 BorderLayout never use NORTH , EAST , WEST and SOUTH for BorderLayout. 此外,当您使用BorderLayout切勿将NORTHEASTWESTSOUTH用作BorderLayout。 They have been replaced with PAGE_START , LINE_START , LINE_END and PAGE_END respectively. 它们分别被PAGE_STARTLINE_STARTLINE_ENDPAGE_END取代。

A BorderLayout object has five areas. BorderLayout对象具有五个区域。 These areas are specified by the BorderLayout constants: 这些区域由BorderLayout常量指定:

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

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. 版本说明:在JDK 1.4版之前,各个区域的首选名称有所不同,从指南针的点(例如,顶部区域为BorderLayout.NORTH)到我们示例中使用的常量的更高级版本。 The constants our examples use are preferred because they are standard and enable programs to adjust to languages that have different orientations. 我们的示例使用的常量是首选的,因为它们是标准的,并使程序能够适应具有不同方向的语言。

Directory Structure : 目录结构:

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

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

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 JFrame for another image use CardLayout instaed 3)不要为使用CardLayout的另一个图像创建新的JFrame

You can simply add a JLable to show image on it. 您可以简单地添加一个JLable在其上显示图像。 After this, you can setVisible JLabel depending on condition. 之后,您可以根据条件设置Visible JLabel。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM