Java GUI,点击按钮时绘制图像

时间:2013-11-19 22:07:24

标签: java swing user-interface jframe paint

我在创建GUI时遇到了一些问题。我想要它,所以当按下按钮时,两个图像将并排显示在屏幕上。将来会有更多的图像,而不仅仅是两个,可能有数百个(很多非常小的图像)我可以在Main类的按钮中添加但是我无法添加动作监听器。当我尝试在GUI类中添加一个按钮时,没有任何显示。同样在动作监听器中,我无法调用paint函数。任何帮助都会很棒,谢谢!

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.Random;

import javax.imageio.*;
import javax.swing.*;


public class Gui extends JFrame {

    private static JButton startButton;

    BufferedImage img;
    BufferedImage img2;


    public void paint(Graphics g) {

        g.drawImage(img, 0, 0, null);
        g.drawImage(img2, 30, 0, null);

    }

    public Gui() {
       try {
           img = ImageIO.read(new File("res/a.png"));
           img2 = ImageIO.read(new File("res/b.png"));

       } catch (IOException e) {
       }

       startButton = new JButton("tessttt");
       getContentPane().add(startButton); //this doesn't show up
       Events e = new Events();
       startButton.addActionListener(e);


    }

    public Dimension getPreferredSize() { //sets size of screen
        if (img == null) {
             return new Dimension(100,100);
        } else {
          // return new Dimension(img.getWidth(null), img.getHeight(null)); //sets size to one image //// change to all images
            return new Dimension(500,500);
       }
    }

    public static void main(String[] args) {

        JFrame f = new JFrame("Load Image Sample");

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(640, 480);

        f.add(new Gui()); //this is the only time I can call this and the images will show up

            JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"));
        f.add(panel);   //this will show up but i can't add an action listener if this was a button

        f.setLayout(new FlowLayout());

            f.setVisible(true);
    }



public class Events implements ActionListener {


        public void actionPerformed(ActionEvent e) {


            if (e.getSource() == startButton) {

            getContentPane.add(new Gui()); //f.add(newGui()); //this also gives errors

        }


        }
    }


}

我按下了按钮。在大班我做了这个

    startButton = new JButton("tessttt");
    f.add(startButton);
    startButton.addActionListener(new ActionListener() {


        public void actionPerformed(ActionEvent e) {
            f.add(new Gui());
            //f.repaint();
        }
    });

现在问题是如何调用油漆?其中任何一个都不起作用。

我得到的错误的前几行

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container
    at java.awt.Container.checkNotAWindow(Unknown Source)
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)

1 个答案:

答案 0 :(得分:3)

首先,GuiJFrame延伸,但在main中,您创建了JFrame的新实例并尝试添加{{1}的实例对它来说。

你不能这样做。顶级容器不能包含另一个顶级容器。

首先,您应该避免从Gui延伸,因为您没有向其添加任何功能。

如你所知,覆盖JFrame顶级容器是不可取的,这样做可以很容易地破坏绘画的工作方式。

相反。

首先创建一个自定义组件,从paint扩展并覆盖它的JPanel方法并在此处添加自定义绘画,确保首先调用paintComponent

这将绘制您的两张图片。

创建另一个自定义组件,从super.paintComponent扩展,将“图像”面板和按钮(以及其他控件)添加到其中,使用您想要的布局管理器,如果需要,还可以使用复合布局。

最后,创建一个JPanel的实例并向其添加“controls”面板......

查看Performing Custom PaintingInitial Threads