单击JButton显示图像

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

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

/** * */ 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); } }); } } 

我正在使用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); } } 

按钮保持器需要在单击时显示图像。

同样地,由其他人说,总是使用JLabel来显示图像。 这样,很容易在需要时添加/删除它们,而不是绘画。 此外,在你的代码中你覆盖了paint(...) ,对于Swing我们更喜欢覆盖相应JComponent paintComponent(...)方法,如果所述组件有一个。

在这里尝试这个代码,我已经分离了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); } } } 

此代码表示您使用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);    } } } 

此外,当您使用BorderLayout永远不要使用NORTHEASTWESTSOUTH作为BorderLayout。 它们已分别替换为PAGE_STARTLINE_STARTLINE_ENDPAGE_END

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

  • PAGE_START
  • PAGE_END
  • LINESTART
  • LINE_END
  • 中央

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

目录结构:

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

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

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

2)创建方法进入class Selectie

 private void setIconToLabel (Icon icon){ myDesiredLabel.setIcon(icon); } 

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

您只需添加一个JLable即可在其上显示图像。 在此之后,您可以根据条件设置可见的JLabel。