Java:向JFrame中的JPanel添加图像

Java:向JFrame中的JPanel添加图像,java,intellij-idea,Java,Intellij Idea,我采纳了一些建议,并重写了一些代码,以实现提出的建议,并使其更具可读性。现在它无法编译。编译器抱怨无法解析JLabel上的构造函数。我就问题所在发表了评论 /** * Created with IntelliJ IDEA. * User: goulartj * Date: 9/4/13 * Time: 10:11 AM * To change this template use File | Settings | File Templates. */ import javax.sw

我采纳了一些建议,并重写了一些代码,以实现提出的建议,并使其更具可读性。现在它无法编译。编译器抱怨无法解析JLabel上的构造函数。我就问题所在发表了评论

/**
 * Created with IntelliJ IDEA.
 * User: goulartj
 * Date: 9/4/13
 * Time: 10:11 AM
 * To change this template use File | Settings | File Templates.
 */

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



public class NewSwing implements ActionListener{

    JFrame frame;
    JTextField textField;
    JTextArea textArea;
    JPanel panel;
    Image image;
    JLabel label;
    private final static String newline = "\n";

    public static void main(String[] args) {
        NewSwing gui = new NewSwing();
        gui.go();
    }

    public void go(){

        frame = new JFrame();
        frame.getContentPane().setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        textField = new JTextField("This is a text field and these are my texticles!");
        textField.selectAll();
        textArea = new JTextArea();
        panel = new JPanel();
        image = new ImageIcon("cuteKitten.jpg").getImage();
        label = new JLabel(image); //COMPILER COMPLAINS HERE
        panel.add(label);


        frame.getContentPane().add(BorderLayout.NORTH, textField);
        frame.getContentPane().add(BorderLayout.CENTER, textArea);
        frame.getContentPane().add(BorderLayout.EAST, panel);
        panel.setBackground(Color.CYAN);




        textField.addActionListener(this);

    }

    public void actionPerformed(ActionEvent event){
        String text = textField.getText();
        textArea.append(text + newline);
        textField.selectAll();
    }

   /* class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g) {
            g.drawImage(image, 3, 4, this);
        }
    }     */
}

提前感谢所有的帮助!你们总是对我很好

它正在显示,但它位于屏幕边缘。 只要改变一下:

frame.getContentPane().add(BorderLayout.EAST,panel)

frame.getContentPane().add(BorderLayout.CENTER,panel)


它应该正确地显示在中间的面板中。

为什么要进行自定义绘制以显示图像

问题是组件没有首选大小(因为您没有重写
getPreferredSize()
方法),因此没有任何可绘制的内容

只需使用带有图标的JLabel。它将在绘制图标和确定适当大小后进行检查。不要重新发明轮子。阅读JLabel API,您将找到一个指向Swing教程的链接,该教程介绍了如何使用标签以获取更多信息


当然,您还需要确保您正在阅读图像。这很简单,只需添加System.out.println(…)即可确保正确创建图标。

您确定它可以找到图像吗?此外,每次需要绘制时都可以从文件创建图像。您将在更大的应用程序中增加渲染时间。您应该创建图像,将其传递到MyDrawPanel构造函数,并使用该图像进行绘制。哦,您应该调用super.paintComponent(g);在你的paintComponent方法中,我不确定它是否能找到图像。我尝试用IntelliJ打开图像并将其添加到项目中,但也没有成功。
现在它无法编译
-在我的回答中,我没有建议您使用图像创建JLabel。再读一遍我的建议。阅读JLabel API以找到合适的构造函数,并阅读教程以获得工作示例。不能在每次出现编译错误时都发布问题。您需要学习如何读取API。将ImageIcon传递到JLabel,而不是图像<代码>http://docs.oracle.com/javase/7/docs/api/javax/swing/JLabel.html
<代码>http://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html
,正如@camickr所说,当您学会如何读取错误和API时,您的生活会变得更轻松。这两件事可以让你在足够的时间内写任何东西。我尝试了你在这里提到的改变,@hdtsn,但它没有做任何事情。更准确地说,它用myDrawPanel覆盖了文本区域,但是图像仍然没有显示在面板上。那么您确定您的图像存在并且位于正确的位置吗?