当前位置: 首页 > 知识库问答 >
问题:

repaint()方法不调用paintComponent()

严心水
2023-03-14

对于我的程序,我目前希望使用open按钮打开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个答案

华佐
2023-03-14

这看起来像是一个家庭作业,所以与其直接用代码回答,不如考虑以下内容:

  • 在方法createandshowgui()中实例化graphicspanel对象并将其添加到jframe
  • actionperformed()方法中,实例化另一个graphicspanel对象(该对象从未添加到JFrame),并调用setimage().

您的图像无法显示,因为添加到JFrame中的GraphicSpanel控件与设置图像的GraphicSpanel控件不同。

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

 类似资料:
  • 基本上,我有一个接口形状,它具有和方法。绘制形状的每个类都实现了这一点。还有一个类包含这些形状类的。然后有一个单独的类包含我的JFrame。我有一个“动画”按钮,它调用中的所有方法。

  • 在试图制作一个非常简单的子弹地狱游戏来学习java时,我遇到了一个障碍: repaint()没有调用油漆组件()。 这是整个程序,目前只需将我每秒创建50次的图像绘制到JFrame上的JPanel上。 在使用断点和println方法进行了一些调试之后,我可以确认正在读取正确的图像,gameTimerAction中的计时器每秒被调用50次,并且repaint()根本没有调用paintComponen

  • 问题内容: 每当我尝试调用repaint()方法时,都会说不能从静态方法引用非静态方法。顺便说一句,它与paintComponent方法在同一类中。我尝试首先在类之外创建一个对象,然后使用对象名称引用它,但是它也没有用。请帮忙。 问题答案: 主要方法是静态的。您的p对象不是:它是P类的实例字段。试试这个: 您应该始终从事件分发线程访问Swing组件,这就是为什么我将它们全部放在EventQueue

  • 我已经花了几天时间试图让Graphics2D类在我的代码中工作。我把它的结构化为这样一种方式,即当注册了一个单击事件时,调用reaint()就完成了,但是当它到达调用repaint()的阶段时,这只会产生一个空指针异常。 调试时,这一切都在按预期工作,而不是从油漆组件方法中调用,但是当试图使用油漆组件和reaint()正确调用代码以允许Graphics2D类显示每个点的行时,它不起作用。 我已经包

  • 首先,请不要因为创建一个问题而将我置于火刑柱上,而其他具有类似名称和内容的人却存在。我把它们都看了一遍,但没有找到解决办法。 调用repaint()绝对不会调用paintComponent(),不管我似乎尝试了什么。下面是与问题相关的所有代码: 按照预期,“创建的级别面板和设置的内容窗格”被打印到控制台。 从不打印“油漆组件级油漆”。“计时器重新绘制”每2秒打印一次,正如预期的那样。

  • 我想做一个象棋游戏,我想在游戏循环中的一个jFrame上调用方法。这个特殊的JFrame显示了每个玩家的总击杀数。我很确定确实调用了repaint(),但由于某种原因,它似乎没有正确更新我的jlabel,jlabel应该保存每个玩家的击杀数值。 这是我为自定义JFrame扩展类编写的代码,该类包含代表kill的JLabel。 然后我只是在不同类的main方法中调用这个框架的repaint(): 非