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

时间:2012-08-08 20:49:22

标签: java swing awt

请你帮我一下吗? 我正在做自己的小'电影'项目,同时尝试学习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
}

4 个答案:

答案 0 :(得分:1)

我见过两个问题:

  1. 您正在使用label.setIcon(image),但您没有设置标签值
  2. 图片应该是新的ImageIcon(imgStr)而不是新的ImageIcon(“commando.jpg”)

答案 1 :(得分:1)

答案 2 :(得分:1)

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

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

拨打invalidaterepaint可能也会有所帮助,但如果没有可行的代码示例,很难确定。

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

答案 3 :(得分:1)

  

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

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

  1. 类文件不一定与源文件位于同一目录中。
  2. 类文件现在可能是Jar中的ZipEntry
  3. '夹'是一个非常基于屏幕的概念,最好将磁盘上的目录视为一个目录' (和zip条目作为zip条目)。
  4. 不要考虑目录或zip条目的包。它可能变得相关,但又是一个不同的东西。
  5. 如何访问图像归结为一个重要问题。图像是应用程序资源吗?

    如果应用程序。对于除了你之外的任何人,它们应该被包含在Jar中作为嵌入式应用程序资源'便于分发。这些是URL访问的。

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


    代码中还存在许多其他错误,这些错误主要在其他答案中得到解决,但同样如此。 使用布局管理组件大小调整和定位。

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