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

想在同一个类中创建JFrame和JPanel并拥有自己的PaintComponent吗?

周伟泽
2023-03-14

我试图在同一个类中创建一个简单的JFrame和JPanel,但我不想扩展JFrame或JPanel Java类中的任何一个。我还希望能够包括我自己的paintComponent(),它将覆盖Panel paint组件,这样我就可以绘制我自己的paint组件。我想创建我的

类别:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class SubtractBufferedImage {
    private static final long serialVersionUID = 1L;

    Dimension dimension = new Dimension(755,450);

    public SubtractBufferedImage() {

        JFrame f = new JFrame();
        JPanel d = new JPanel();/*User defined class that is above*/
        d.setBackground(Color.BLACK);

        f.add(new myPanel());
        f.setSize(745,440); 
        f.setSize(dimension);
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setTitle("Subtract Buffered Images");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SubtractBufferedImage t = new SubtractBufferedImage();

    }
}

class myPanel extends JPanel {
    private BufferedImage bTest1 = null;
    private BufferedImage bTest2 = null;

    Dimension dimension = new Dimension(755,450);

    private String iOne = "src/com/ddh/graphicsBook/CardImage/hold.jpg";
    private String iTwo = "src/com/ddh/graphicsBook/CardImage/draw.jpg";

    myPanel() {
        bTest1 = loadAnyImage(iOne);
        bTest2 = loadAnyImage(iTwo);
    }

    private BufferedImage loadAnyImage(String value){
        BufferedImage newImage = null;

        try {
            newImage = ImageIO.read(new File(value));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newImage;
    }

    private void drawImageToScreen(Graphics g,BufferedImage i,int x,int y){
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(i,x,y,null); 
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);  
            drawImageToScreen(g,bTest1,10,10);
            drawImageToScreen(g,bTest2,150,10);
    }
}

共有1个答案

诸葛奇玮
2023-03-14

JPanel和JFrame都是Java类,而不是接口,因此基本上不能在它们内部实现自己的方法(根据SOLID rules open/closed原则,它们对扩展开放,但对修改关闭)。要实现自己的paintComponent,必须扩展JPanel,通常就是这样做的。我不知道为什么您不愿意扩展这些类,但如果您这样做了,您就可以实现所有其他规范:

  • 您可以在扩展类中实现自己的paintComponent方法,
  • 在一个类中可以同时拥有JPanel的扩展和JFrame的扩展。
 类似资料:
  • 关于您要更改的注释添加公共显示(图形g) [链接]http://www3.canyons.edu/faculty/biblej/project6.html 1.)Project6类必须扩展JFrame类2.)Project6构造函数必须设置GUI窗口3.)一个新的抽象方法:public void display(Graphics g);应该添加到基和派生类4.)一个自定义JPanel必须使用pai

  • 我必须插入一个JFrame,另一个类的一个JPanel。我在JFrame中有一个jMenuItem,我希望这样,当我单击jMenuItem,就会出现JPanel。

  • 好吧,所以我试图在Java创建自己的LinkedList类(带有泛型类型),但是遇到了一些问题。我创建了一个LinkedListNode类,它基本上设置并获取next和right指针以及节点的键。我的LinkedList类代码发布在下面,如果您编译并运行,您会发现它没有按照应该的方式设置列表。此刻,我正在尝试在节点x之后插入节点y,但我的打印输出看起来像: 键:5-上一键:6-下一键:6键:6-上

  • 在创建其他依赖bean之前,是否可以避免@Autowire某些bean?让我用一个例子更好地解释一下: 我有一个FactoryBean,它创建了一个类型为A的对象,该对象具有一个名为a的属性。如果属性为null,它会为bean A分配默认值。 在@Configuration类中,我有: 发生的事情是工厂创建bean(我不完全理解如何创建),但工厂中的字段a为null,我需要它使用另一个bean来创

  • 当我们使用术语"类库"时,我们一般指的是位于libraries 文件夹中的类,它们在wiki的"类库参考"这个板块被讨论.在当前这个话题中,我们将讨论如何在 application/libraries 文件夹中建立你自己的类库,并使它们与全框架的资源维持分离. 作为一个额外的功能,当你需要在原始类中简单地添加一些功能时,CodeIgniter能使你的类库extend 自原始类.你甚至可以通过在ap