Java JPanel I'的混淆性质;我想用

Java JPanel I'的混淆性质;我想用,java,swing,jframe,jpanel,javax.imageio,Java,Swing,Jframe,Jpanel,Javax.imageio,我正在用swing构建一个简单的GUI,但我遇到了一个无法找出原因的问题。创建缓冲映像会阻止代码的其余部分执行任何操作 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.BorderFactory; import java.awt.image.BufferedImage; import jav

我正在用swing构建一个简单的GUI,但我遇到了一个无法找出原因的问题。创建缓冲映像会阻止代码的其余部分执行任何操作

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.BorderFactory;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Main extends JPanel{

    BufferedImage img;
    int number;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Some practice");
        frame.setSize(200,200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        Main doStuff = new Main();

        JButton myButton = new JButton("Button");
        JPanel controls = new JPanel();
        controls.setBorder(BorderFactory.createTitledBorder(
                             "Small Panel"));
        controls.add(myButton);
        frame.add("South", controls);

        frame.add(doStuff);
    }

    public Main () {
        super.setBorder(BorderFactory.createTitledBorder("Big Panel!"));

        // This method seems to shut down my GUI
        importImage();
    }

    private void importImage() {
        try {
                img = ImageIO.read(new File("res/strawberry.jpg"));
        } catch (IOException e) {
                System.out.println("Image exception");
        }
    }
}
如果在
Main
的构造函数中有我的
importImage
函数,则GUI不会显示。尝试注释掉行
doStuff()将显示两个带边框的面板


我想知道的是,Java或Swing的哪些特性导致了这种混乱?谢谢

Move
frame.setVisible(true)
main()
的末尾

然后将构造函数更改为使用
add(ImagePanel)
like

String imgPath = "res/strawberry.jpg";
add(new ImagePanel(imgPath));   
最后,您应该在一个新的
线程
上下文中进行操作,我在
Main
中添加了一个
ActionListener
,这样您就可以单击该按钮了。把它们放在一起

public class Main extends JPanel implements ActionListener {
    BufferedImage img;
    int number;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Some practice");
        Runnable doRun = new Runnable() {
            @Override
            public void run() {
                frame.setSize(200, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Main doStuff = new Main();

                JButton myButton = new JButton("Button");
                myButton.addActionListener(doStuff);
                JPanel controls = new JPanel();
                controls.setBorder(BorderFactory
                        .createTitledBorder("Small Panel"));
                controls.add(myButton);
                frame.add("South", controls);
                frame.add(doStuff);
                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(doRun);
    }

    public Main() {
        super.setBorder(BorderFactory.createTitledBorder("Big Panel!"));
        final String imgPath = "res/strawberry.jpg";
        // This method seems to shut down my GUI
        add(new ImagePanel(imgPath));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e);
    }
}

图像有多大?80x80。增加帧大小似乎没有帮助。哇,那
ImagePanel
是垃圾代码!我数了至少8行,让我觉得作者应该回去学习基础知识。如果您计算缺少的
super.paintComponent(g),则为9呼叫。
String imgPath = "res/strawberry.jpg";
add(new ImagePanel(imgPath));   
public class Main extends JPanel implements ActionListener {
    BufferedImage img;
    int number;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Some practice");
        Runnable doRun = new Runnable() {
            @Override
            public void run() {
                frame.setSize(200, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Main doStuff = new Main();

                JButton myButton = new JButton("Button");
                myButton.addActionListener(doStuff);
                JPanel controls = new JPanel();
                controls.setBorder(BorderFactory
                        .createTitledBorder("Small Panel"));
                controls.add(myButton);
                frame.add("South", controls);
                frame.add(doStuff);
                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(doRun);
    }

    public Main() {
        super.setBorder(BorderFactory.createTitledBorder("Big Panel!"));
        final String imgPath = "res/strawberry.jpg";
        // This method seems to shut down my GUI
        add(new ImagePanel(imgPath));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e);
    }
}