单击按钮时无法在我的 JLabel 中显示图像 - Java



如果可能的话,你能帮我吗?我正在做我自己的小"电影"项目,同时尝试学习Java。

我已经设法创建了一个 JLabel,当单击按钮时会显示我的文本,它基本上是关于我最喜欢的电影。因此,当我单击突击队按钮时,会弹出它的简要简介。所以我决定添加一个图像,它位于我的 Java 包所在的同一文件夹中。

我已经研究了如何应用我的图像,以便它与文本同时显示,但它似乎不起作用。我还有很多东西要学,任何指导将不胜感激!!

提前感谢任何帮助!! ;]

达兹。

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import java.awt.event.*;
import javax.swing.ImageIcon;
public class Movies {
    JFrame frame;
    JLabel label;
    public static void main(String []args){
            Movies gui = new Movies();
            gui.go();
    }
    public void go(){
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton commandoButton = new JButton("Commando");
        commandoButton.addActionListener(new LabelListener());
        frame.setLayout(null); // equivalent to frame.getContentPane().setLayout(null);
        frame.add(commandoButton); // equivalent to frame.getContentPane().add(button);
        commandoButton.setBounds(10, 10, 150, 25);
        JButton predatorButton = new JButton("Predator");
        predatorButton.addActionListener(new LabelListenerA());
        frame.setLayout(null); // equivalent to frame.getContentPane().setLayout(null);
        frame.add(predatorButton); // equivalent to frame.getContentPane().add(button);
        predatorButton.setBounds(10, 40, 150, 25);
        JButton expendablesButton = new JButton("The Expendables");
        expendablesButton.addActionListener(new LabelListenerB());
        frame.setLayout(null); // equivalent to frame.getContentPane().setLayout(null);
        frame.add(expendablesButton); // equivalent to frame.getContentPane().add(button);
        expendablesButton.setBounds(10, 70, 150, 25);
        frame.getContentPane().add(BorderLayout.WEST, commandoButton);
        frame.setSize(1000, 350);
        frame.setVisible(true);
    }
    JTextPane labelCommando = new JTextPane();
    class LabelListener implements ActionListener {
        public void actionPerformed(ActionEvent commandoButton){            
            labelCommando.setText("A retired elite Black Ops Commando launches a one man war against a group of South American criminals who have kidnapped his daughter to blackmail him into starting a revolution and getting an exiled dictator back into power. ");
            frame.add(labelCommando);
            labelCommando.setBounds(170, 10, 500, 200);
            labelCommando.setOpaque(false);
            String imgStr = "images/commando.jpg";
            ImageIcon image = new ImageIcon("commando.jpg");
            JLabel labelCommando = new JLabel(" ", image, JLabel.CENTER);
            label.setIcon(image);
        }
    } // Close inner class
    class LabelListenerA implements ActionListener {
        public void actionPerformed(ActionEvent predatorButton){            
            labelCommando.setText("Not long after they land, Dutch and his team discover    that they have been sent under false pretenses. This deception turns out to be the least of their worries though, when they find themselves being methodically hunted by something not of this world...");
            frame.add(labelCommando);
            labelCommando.setBounds(170, 10, 500, 200);
            labelCommando.setOpaque(false);
        }
    } // Close inner class
    class LabelListenerB implements ActionListener {
        public void actionPerformed(ActionEvent expendablesButton){
            labelCommando.setText("Barney Ross leads the 'Expendables', a band of highly  skilled mercenaries including knife enthusiast Lee Christmas, martial arts expert Yin Yang, heavy weapons specialist Hale Caesar, demolitionist Toll Road and loose-cannon sniper Gunner Jensen. When the group is commissioned by the mysterious Mr. Church to assassinate the merciless dictator of a small South American island, Barney and Lee head to the remote locale to scout out their opposition. Once there, they meet with local rebel Sandra and discover the true nature of the conflict engulfing the city. When they escape the island and Sandra stays behind, Ross must choose to either walk away and save his own life - or attempt a suicidle rescue mission that might just save his soul.");
            frame.add(labelCommando);
            labelCommando.setBounds(170, 10, 500, 200);
            labelCommando.setOpaque(false);
        }
    } // Close inner class
}

我看到的两个问题:

  1. 您正在使用 label.setIcon(image),但尚未将值设置为标签
  2. 图像应该是新的 ImageIcon(imgStr) 而不是新的 ImageIcon("commando.jpg)
  • JLabel label;没有初始化

  • ,必须JLabel label = new JLabel();
  • JLabel未添加到容器中,则 GUI 中不显示任何代码

  • 使用标准布局管理器而不是setBounds()

  • 使用 JScrollPane for JTextArea

我已经扫描了您的代码,找不到您正在创建(或添加)label的任何地方,现在假设您在运行程序时没有收到任何错误,这表明代码片段不完整。

确保label已创建并添加到屏幕的某个位置。

调用 invalidaterepaint 也可能有所帮助,但如果没有有效的代码示例,很难确定。

我不知道为什么人们坚持使用空布局管理器,但我建议先对布局管理器进行测试,这至少消除了组件布局不正确的疑问。

..它位于我的 Java 包所在的同一文件夹中。

这个简单的陈述表明了一些误解,这些误解可能是问题的根源。

  1. 类文件不一定与源文件位于同一目录中。
  2. 类文件现在可能是 Jar 中的ZipEntry
  3. "
  4. 文件夹"是一个非常基于屏幕的概念,最好将磁盘上的目录视为"目录"(将 zip 条目视为 zip 条目)。
  5. 不要从目录或 zip 条目的角度考虑包。 它可能会变得相关,但又是另一回事。

如何访问图像归结为一个重要问题。 映像是应用程序资源吗?

如果该应用程序适用于除您之外的任何人,则应将它们作为"嵌入式应用程序资源"包含在 Jar 中,以便于分发。 这些可以通过URL .

如果应用程序仅适用于您,则包含图像的目录的硬编码路径就足够了。 通过将 String 参数传递给 ImageIcon 构造函数,我们表明我们需要基于该路径的File,但"相对路径"很少起作用(除非开发人员特别努力确保图像在该路径上相对于 ..当前目录)。 相反,最好硬编码包含图像的目录的绝对路径,然后在运行时添加图像文件名。


代码中还有许多其他错误,这些错误大多在其他答案中得到解决,但再次解决。 使用布局管理组件大小调整和定位。

似乎JTableJList可能也比一堆按钮更好。

最新更新