【问题标题】:How to make a clickable image?如何制作可点击的图片?
【发布时间】:2016-04-27 19:37:05
【问题描述】:

我完全一无所知,迷路了。我最近开始使用 Java 进行编程。我想制作一个程序来显示用户可以单击的图像(带有图像的按钮)并作为回报播放声音。我看过很多教程,但当我遵循它们时它们不起作用。另外我不知道是否应该使用 swing 或 javaFX 或 awt,或者是否只需要为图像和按钮创建一个新文件。请帮忙。

【问题讨论】:

  • 这是你的第一个程序吗?
  • 最简单的方法是在图像周围创建一个矩形,然后将一个点作为鼠标位置并使用 Rectangle 类的 .contains() 方法。在这里翻转一个布尔值来做你想做的事情。
  • I'm completely clueless and lost. - 从 How to Use Buttons 上的 Swing 教程开始,了解工作代码和解释。 I've watched many tutorials and they don't work when I follow them - 下载教程代码并测试程序。如果有什么你不明白的,然后问一个具体的问题。我们无法从其他教程中猜出您对哪些内容感到困惑。

标签: java image swing jbutton


【解决方案1】:

这是一个使用 JavaFX 的示例。您的问题被标记为 Swing,但问题文本提到您正在考虑使用 JavaFX,所以我想我会提供此解决方案,以便您可以看到 JavaFX 样式的实现是什么样的。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.*;
import javafx.scene.layout.StackPane;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class ImageAudioPlayer extends Application {
    private static final String BUTTON_ICON_LOC =
            "http://icons.iconarchive.com/icons/mirella-gabriele/fantasy-mediaeval/128/Poison-red-icon.png";
    private static final String AUDIO_FILE_LOC =
            "http://soundbible.com/mp3/Power_Up_Ray-Mike_Koenig-800933783.mp3";

    @Override
    public void start(Stage stage) throws Exception {
        final AudioClip audioClip = new AudioClip(AUDIO_FILE_LOC);
        final ImageView graphic = new ImageView(new Image(BUTTON_ICON_LOC));

        Button button = new Button(null, graphic);
        button.setStyle("-fx-base: mistyrose;");
        button.setOnAction(event -> audioClip.play());

        StackPane layout = new StackPane(button);
        layout.setPadding(new Insets(10));
        stage.setScene(new Scene(layout));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

我不太了解 Swing,所以我不会为此提供解决方案。 Library recommendations are off-topic for StackOverflow,所以我不会在这里提供图书馆推荐,并鼓励您自己研究潜在的技术,并决定最适合您的应用程序要求和技能的匹配。

【讨论】:

  • “库建议与 StackOverflow 无关” - 那么您应该将该问题投票为离题
  • ...或者您可以提供有关您正在考虑的图书馆的信息,因为您让我感到好奇 :)
  • 需要进行一些更改才能使用 Java 7(没有 lambda 和 new StackPane(); layout.getChildren().add(button);),但最后是我可以使用的 JavaFX 示例,谢谢! :) 我将编辑我的答案以在 Swing 中做出相同的回答。
【解决方案2】:

搜索更多:有答案here

Icon img = new ImageIcon("/class/path/to/image.png");
JButton btn = new JButton(img);

确保/class/path/to/image.png 在类路径中。如果它是硬盘驱动器中的图像,则必须先加载它,如我链接的答案中所述。

编辑:将 JavaFX 中的 @jewelsea 示例转换为 Swing:

public class ImageAudioPlayer extends JFrame {

    private static final String BUTTON_ICON_LOC =
            "http://icons.iconarchive.com/icons/mirella-gabriele/fantasy-mediaeval/128/Poison-red-icon.png";
    private static final String AUDIO_FILE_LOC =
            "http://soundbible.com/grab.php?id=1019&type=wav";

    public ImageAudioPlayer() throws MalformedURLException {
        super("Audion button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container cp = getContentPane();
        Icon icon = new ImageIcon(new URL(BUTTON_ICON_LOC));
        JButton button = new JButton(icon);
        cp.add(button, BorderLayout.CENTER);
        button.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                playAudio();
            }
        });
    }

    private void playAudio() {
        // Not nearly as easy as JavaFX, and cannot play MP3
        try {
            URL url = new URL(AUDIO_FILE_LOC);
            final Clip clip = AudioSystem.getClip();
            AudioInputStream ais = AudioSystem.getAudioInputStream(url);
            clip.open(ais);
            clip.start();
            clip.addLineListener(new LineListener() {
                @Override public void update(LineEvent event) {
                    if (event.getType() == LineEvent.Type.STOP)
                        clip.close();
                }
            });
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws MalformedURLException {
        ImageAudioPlayer iap = new ImageAudioPlayer();
        iap.pack();
        iap.setVisible(true);
    }

【讨论】:

    【解决方案3】:

    我个人最近一直在尝试使用 Swing,我认为它相当直观,至少在基础级别上是这样。 您想要的是与图像对象类似的东西,并添加了一个侦听器,用于点击反应/您希望对其做出反应。 像这样的东西: Adding a mouse listener to image or image Icon in java

    或者,您可以使用 swing 库中的内置按钮对象并为其设置图像。您仍然需要将侦听器配置为执行您希望执行的任何操作。 沿着这些思路: How do I add an image to a JButton

    Setting up an action listener.

    【讨论】:

      【解决方案4】:

      我认为如果您是初学者,您可以从 swing 和 netbeans 开始:here 是一个简单的教程,如何在 swing 中处理图像:

      其他不错的教程:
      正文:here
      视频:here

      【讨论】:

        【解决方案5】:

        您应该使用 Swing 或 JavaFX...
        AWT 已经很老了,除非没有其他办法,否则不应该使用(我听说有时在 OSX 上,Swing 会出现一些问题......)。
        Swing 是 Java 中最常见的 GUI-Toolkit,但 Oracle 宣布 JavaFX 将完全取代 Swing。
        在我看来 Swing 更容易上手,因为有 eclipse 窗口构建器之类的工具,可以让你在图形界面中创建应用程序,但 JavaFX 更有可能在未来被使用,因为它有一些很大的改进Swing(如 CSS 皮肤等)。

        所以你基本上必须决定你更喜欢什么:

        JavaFX 将成为未来的工具包 - Swing 仍然是 - 最常用的工具包,提供更多支持等。

        如果您使用的是 Swing,我认为 JLabel 可以包含图像 - 如果您添加一个 mouseClicked 侦听器,这可能是要走的路...

        【讨论】:

          【解决方案6】:

          您可以将图像对象包装在锚标记内:

          <a href="http://www.w3schools.com"><img src="pic_mountain.jpg" alt="Mountain View" style="width:304px;height:228px;"></a>

          【讨论】:

          • jbutton ,图像和摇摆
          猜你喜欢
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 2014-05-19
          • 1970-01-01
          • 1970-01-01
          • 2014-02-27
          相关资源
          最近更新 更多