【问题标题】:Inserting event handler into images using Java GUI使用 Java GUI 将事件处理程序插入图像
【发布时间】:2016-04-29 09:25:08
【问题描述】:

我想插入一个图像,然后想使用 Java GUI 向该图像添加一个事件。我添加了图像,然后尝试将其插入此容器中,但它显示错误。您能否告诉我在 Java 中插入图像然后向该图像或事件处理程序添加侦听器的正确方法?或者如果使用容器来处理图像是正确的方法。我该怎么做?

这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.Random;

public class Back extends JFrame { 
    private Container pane;
    public Back() {
        super("title");
        setLayout(null);

        Icon i=new ImageIcon(getClass().getResource("1.png"));
        pane=new Container();

        thehandler hand=new thehandler(); //konstruktori i handler merr 
                                          //nje instance te Background
    }

    private class thehandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {

        }
    }

    public static void main(String[] args) {
        Back  d = new Back() ;

        d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        d.getContentPane().setBackground(Color.GREEN);
        d.setSize(700,500);

        d.setVisible(true); 
    }
}

【问题讨论】:

  • 您可以使用JLabelJButton 作为图标,也可以直接在该组件上添加监听器。更多解释请参见this tutorial
  • OK 是另一种不使用 JLabel 或 JButton 插入图像的方法吗?
  • 我知道的唯一其他方法是在 paintComponent 方法中绘制图像 (graphics.drawImage(...)),例如 JPanel。顺便说一句,我忘了提及:1)请始终发布您收到的完整错误消息 2)确保图像实际上位于项目的 src 文件夹中
  • 处理程序(应该是处理程序)必须继承自一些具有implemented ActionListener in API的JComponent

标签: java swing awt actionlistener


【解决方案1】:

这是一个使用JButton制作可点击按钮的示例

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUITemplate {
    JFrame myMainWindow = new JFrame("Title");
    JPanel  firstPanel = new JPanel();

    private void runGUI() {
        myMainWindow.setBounds(10, 10, 400, 400);
        myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myMainWindow.setLayout(new GridLayout(1,1));
        createFirstPanel();
        myMainWindow.getContentPane().add(firstPanel);
        myMainWindow.setVisible(true);
    }

    private void createFirstPanel() {
        firstPanel.setLayout(new FlowLayout());

        ImageIcon image1 = new ImageIcon("YourImage.ImageFileType");
        Image image2 = image1.getImage().getScaledInstance(300,300,0);
        ImageIcon image3 = new ImageIcon(image2);

        JButton jB = new JButton(image3);
        jB.addActionListener(new TheHandler());
        firstPanel.add(jB);
    }

    private class TheHandler implements ActionListener { //Changed thehandler to TheHandler
        public void actionPerformed(ActionEvent event) { //because it is a class
            //Do Something
        }
    }

    public static void main(String[] args) {
        GUITemplate gt = new GUITemplate();
        gt.runGUI();
    }
}

【讨论】:

  • “很抱歉在面板上使用了空布局,只是使用了我找到的旧模板” - 预计不会得到宽恕,因为删除它不需要太多努力
  • @MadProgrammer 你真的非常讨厌空布局,不是吗?
  • 过去 6 年我一直在清理另一个违反几乎所有布局规则(包括使用 null 布局)的开发人员的烂摊子,所以是的,我讨厌 null 布局.对于许多没有经验的开发人员来说,他们认为他们知道如何处理 null 布局,却不了解布局管理 API 提供的角色,而且必须一直修复很痛苦
  • @MadProgrammer 好的。我可以改变这个
  • 我会查看 Image#getScaledInstance 并且不在 EDT 上运行代码 ;)
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多