repaint()方法不调用paintComponent()

时间:2015-04-12 18:03:02

标签: java image swing graphics paintcomponent

对于我的程序我目前想要使用打开按钮打开JFileChooser并选择一个图像,然后在applet左侧的JPanel上绘制它,我知道该文件正在被检索但是当我去重绘图形上下文没有任何反应。提前谢谢。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.JFrame;

public class FinalProject390 {

    public static void main(String[] args) {
        createAndShowGUI();

    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame("Final Project");

        f.setSize(1025, 520);

        f.add(new GraphicsPanel());
        f.add(new MainPanel());
        f.setVisible(true);

    }
}

class MainPanel extends JPanel implements ActionListener {
    JButton openButton = new JButton("Open");
    JButton newButton = new JButton("New");
    JButton saveButton = new JButton("Save");
    JButton saveAsButton = new JButton("Save As");
    JButton drawLineButton = new JButton("Draw Line");
    JButton drawRectangleButton = new JButton("Draw Rectangle");
    JButton drawOvalButton = new JButton("Draw Oval");
    JButton drawArcButton = new JButton("Draw Arc");
    JButton extractPixelDataButton = new JButton("Extract Pixel Data");
    JButton convoluteButton = new JButton("Convolute");
    JTextField xPosStartField = new JTextField("x-Position Start");
    JTextField yPosStartField = new JTextField("y-Position Start");
    JTextField xPosEndField = new JTextField("x-Position End");
    JTextField yPosEndField = new JTextField("y-Position End");
    JTextField angleStartField = new JTextField("Angle Start");
    JTextField angleSizeField = new JTextField("Angle Size");

    public MainPanel() {

        openButton.setBounds(660, 50, 100, 30);
        openButton.addActionListener(this);
        newButton.setBounds(780, 50, 100, 30);
        saveButton.setBounds(900, 50, 100, 30);
        drawLineButton.setBounds(660, 110, 160, 30);
        drawRectangleButton.setBounds(840, 110, 160, 30);
        drawOvalButton.setBounds(660, 155, 160, 30);
        drawArcButton.setBounds(840, 155, 160, 30);
        extractPixelDataButton.setBounds(660, 220, 160, 30);
        convoluteButton.setBounds(840, 220, 160, 30);

        xPosStartField.setBounds(660, 280, 100, 30);
        yPosStartField.setBounds(660, 320, 100, 30);
        xPosEndField.setBounds(660, 380, 100, 30);
        yPosEndField.setBounds(660, 420, 100, 30);
        angleStartField.setBounds(900, 280, 100, 30);
        angleSizeField.setBounds(900, 320, 100, 30);

        setLayout(null);
        setBackground(Color.green);
        setBounds(641, 0, 370, 480);

        add(openButton);
        add(newButton);
        add(saveButton);
        add(drawLineButton);
        add(drawRectangleButton);
        add(drawOvalButton);
        add(drawArcButton);
        add(extractPixelDataButton);
        add(convoluteButton);
        add(xPosStartField);
        add(yPosStartField);
        add(xPosEndField);
        add(yPosEndField);
        add(angleStartField);
        add(angleSizeField);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        javax.swing.JFileChooser fileChooser = new JFileChooser();
        BufferedImage bin = null, bi = null;
        GraphicsPanel gPanel = new GraphicsPanel();

        fileChooser.setCurrentDirectory(new File(System
                .getProperty("user.home")));

        int result = fileChooser.showOpenDialog(null);

        if (result == javax.swing.JFileChooser.APPROVE_OPTION) {
            File selectedFile = fileChooser.getSelectedFile();
            System.out.println("Selected file: "
                    + selectedFile.getAbsolutePath());
            try {
                bin = ImageIO.read(new File(selectedFile.getAbsolutePath()));
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            gPanel.setImg(bin);

        }

    }
}
    class GraphicsPanel extends JPanel {
        BufferedImage bi = null, bin = null;

        public GraphicsPanel() {
            setLayout(null);
            setBackground(Color.blue);
            setSize(640, 480);
            setLocation(0, 0);

        }

        public void setImg(BufferedImage b) {
            this.bi = b;
            repaint();

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.drawImage(bi, 0, 0, null);

        }
    }

1 个答案:

答案 0 :(得分:0)

这看起来像是家庭作业,所以请考虑以下内容而不是代码的完全答案:

  • 在方法createAndShowGUI()中,您实例化GraphicsPanel对象并将其添加到JFrame
  • actionPerformed()方法中,您实例化另一个GraphicsPanel对象(永远不会添加到JFrame中),然后调用setImage()

您的图片无法显示,因为添加到GraphicsPanel的{​​{1}}控件与您设置图片的JFrame控件不同。

我希望这足以帮助您修复代码。