Java 如何将paintComponent()添加到JPanel

Java 如何将paintComponent()添加到JPanel,java,swing,object,graphics,awt,Java,Swing,Object,Graphics,Awt,我有2个班,2班和4班。我希望使用p4.add(c2o)和f.add(p4)方法将Class2中的绘画从Class4添加到Class4中的JPanel中。我在添加GUI方面没有问题,但我就是不能添加图形 Class4: import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; public class Class4 {

我有2个班,2班和4班。我希望使用p4.add(c2o)和f.add(p4)方法将Class2中的绘画从Class4添加到Class4中的JPanel中。我在添加GUI方面没有问题,但我就是不能添加图形

Class4:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Class4 {


    public void mainMethod(int event){
        JFrame f = new JFrame("Love Test");
        if(event == 0){

            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(500,200);
            f.setLayout(null);

            JPanel p = new JPanel(new BorderLayout());
            p.setBounds(150, 0, 350, 75);
            Class3 c3o = new Class3();
            p.add(c3o);
            f.add(p);

            JPanel p2 = new JPanel();
            Class7 c7o = new Class7();
            p2.add(c7o);
            p2.setBounds(0, 75, 500, 40);
            f.add(p2);

            JPanel p3 = new JPanel();
            p3.setBounds(0, 0, 150, 75);
            Class5 c5o = new Class5();
            p3.add(c5o);
            f.add(p3);

            f.setVisible(true);

        }

        if(event == 5){

            JPanel p4 = new JPanel();
            Class2 c2o = new Class2();
            p4.add(c2o);
            p4.setBounds(0,115,500,55);
            f.add(p4);
        }

    }


}
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java.util.Random;
import java.awt.*;



public class Class2 extends JPanel{

    public void paint(Graphics g){
        super.paint(g);
        this.setBackground(Color.WHITE);
        g.setColor(new Color(0,0,0));
        String str = "";
        String str2 = "";
        Random rlove = new Random();
        int love = rlove.nextInt(101);
        Class3 c3o = new Class3();
        str = c3o.boy.getText() + " and " + c3o.girl.getText() + "'s amount of love is " + love + "%.";
        if(love >= 0 && love < 10){         
            str2 = "Stop thinking about that person anymore!";
        }
        if(love >= 10 && love < 20){
            str2 = "1/100 percent chance...";
        }
        if(love >= 20 && love < 30){
            str2 = "Little hope...";
        }
        if(love >= 30 && love < 40){
            str2 = "Not even a kiss, stop talking about French kisses! (wise words of Rubesh)";
        }
        if(love >= 40 && love < 50){
            str2 = "Near passing";
        }
        if(love >= 50 && love < 60){
            str2 = "Just Pass";
        }
        if(love >= 60 && love < 70){
            str2 = "Some effort needed.";
        }
        if(love >= 70 && love < 80){
            str2 = "Grade A. A good chance.";
        }
        if(love >= 80 && love < 90){
            str2 = "Good pair. Very good relationship!";
        }
        if(love >= 90 && love < 100){
            str2 = "Perfect pair. Lost for words.";
        }
        if(love == 100){
            str2 = "OH MY GOD!!!!!";
        }
        g.drawString(str,10,10);
        g.drawString(str2,10,30);
    }


}
Class2:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Class4 {


    public void mainMethod(int event){
        JFrame f = new JFrame("Love Test");
        if(event == 0){

            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(500,200);
            f.setLayout(null);

            JPanel p = new JPanel(new BorderLayout());
            p.setBounds(150, 0, 350, 75);
            Class3 c3o = new Class3();
            p.add(c3o);
            f.add(p);

            JPanel p2 = new JPanel();
            Class7 c7o = new Class7();
            p2.add(c7o);
            p2.setBounds(0, 75, 500, 40);
            f.add(p2);

            JPanel p3 = new JPanel();
            p3.setBounds(0, 0, 150, 75);
            Class5 c5o = new Class5();
            p3.add(c5o);
            f.add(p3);

            f.setVisible(true);

        }

        if(event == 5){

            JPanel p4 = new JPanel();
            Class2 c2o = new Class2();
            p4.add(c2o);
            p4.setBounds(0,115,500,55);
            f.add(p4);
        }

    }


}
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java.util.Random;
import java.awt.*;



public class Class2 extends JPanel{

    public void paint(Graphics g){
        super.paint(g);
        this.setBackground(Color.WHITE);
        g.setColor(new Color(0,0,0));
        String str = "";
        String str2 = "";
        Random rlove = new Random();
        int love = rlove.nextInt(101);
        Class3 c3o = new Class3();
        str = c3o.boy.getText() + " and " + c3o.girl.getText() + "'s amount of love is " + love + "%.";
        if(love >= 0 && love < 10){         
            str2 = "Stop thinking about that person anymore!";
        }
        if(love >= 10 && love < 20){
            str2 = "1/100 percent chance...";
        }
        if(love >= 20 && love < 30){
            str2 = "Little hope...";
        }
        if(love >= 30 && love < 40){
            str2 = "Not even a kiss, stop talking about French kisses! (wise words of Rubesh)";
        }
        if(love >= 40 && love < 50){
            str2 = "Near passing";
        }
        if(love >= 50 && love < 60){
            str2 = "Just Pass";
        }
        if(love >= 60 && love < 70){
            str2 = "Some effort needed.";
        }
        if(love >= 70 && love < 80){
            str2 = "Grade A. A good chance.";
        }
        if(love >= 80 && love < 90){
            str2 = "Good pair. Very good relationship!";
        }
        if(love >= 90 && love < 100){
            str2 = "Perfect pair. Lost for words.";
        }
        if(love == 100){
            str2 = "OH MY GOD!!!!!";
        }
        g.drawString(str,10,10);
        g.drawString(str2,10,30);
    }


}
import javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入java.util.Random;
导入java.awt.*;
公共类Class2扩展了JPanel{
公共空间涂料(图g){
超级油漆(g);
这个.背景(颜色.白色);
g、 setColor(新颜色(0,0,0));
字符串str=“”;
字符串str2=“”;
随机rlove=新随机();
int love=rlove.nextInt(101);
Class3 c3o=新的Class3();
str=c3o.boy.getText()+”和“+c3o.girl.getText()+”的爱的量是“+love+”%”;
如果(爱>=0&&love<10){
str2=“别再想着那个人了!”;
}
如果(爱>=10&&love<20){
str2=“1/100%的机会……”;
}
如果(爱>=20&&love<30){
str2=“小希望……”;
}
如果(爱>=30&&love<40){
str2=“甚至连一个吻都没有,别再谈法式吻了!(鲁比什的智慧之言)”;
}
如果(爱>=40&&love<50){
str2=“接近超车”;
}
如果(爱>=50&&love<60){
str2=“刚刚通过”;
}
如果(爱>=60和爱<70){
str2=“需要一些努力。”;
}
如果(爱>=70&&love<80){
str2=“A级。一个好机会。”;
}
如果(爱>=80&&love<90){
str2=“好搭档,关系很好!”;
}
如果(爱>=90&&love<100){
str2=“完美的一对。文字迷茫。”;
}
如果(爱=100){
str2=“哦,我的天啊!!!”;
}
g、 抽绳(str,10,10);
g、 抽绳(str2,10,30);
}
}

如何将paintComponent添加到JPanel p4?谢谢

这个问题没有简单明了的答案,但我会尽力解释

你需要做的是设置一个画布,就像你要放置一个按钮或标签一样,然后你需要添加一个鼠标听写器。MouseListener界面用于跟踪要在其中绘制项目的鼠标。我已经设置了一个完整的示例,包括颜色选择和形状选择,由于代码的共享量,我使用pastebin来共享

在这之后,我解释了这方面的关键要素。看看:

这里的关键要素如下

内部助手类“Board”是画布,它实现了MouseListener和MouseMotionListener,这是为了跟踪鼠标移动和按键

private class Board extends JPanel implements 
    MouseListener, MouseMotionListener {
paintComponent(Graphics g)是负责绘制的方法,我使用Graphics2D库创建形状

mousePressed(MouseEvent e)接收形状应绘制位置的起始坐标

public void mousePressed(MouseEvent e) {
    startPoint = e.getPoint();
}
鼠标单击结束时调用MouseRelease(MouseEvent e),此方法处理图形的绘制。我使用了一个开关盒来处理不同的形状,然后检查坐标来处理形状的绘制。有关形状的详细信息

释放鼠标时,将运行以下代码:

shapes.add(s); //Adds the new shape to the Vector of shapes
startPoint = null; //Resets the starting ...
endPoint = null; //and ending coordinates to the system
colorList.add(color); 
repaint(); //Repaints the entire canvas with the shapes in the Vector<Shape>
shapes.add//将新形状添加到形状向量中
startPoint=null//重置启动。。。
端点=空//和系统的结束坐标
颜色列表。添加(颜色);
重新油漆()//使用向量中的形状重新绘制整个画布
我不仅想在释放鼠标键时绘制形状,当拖动鼠标时,我想在移动时重新绘制形状,这是通过mouseDragged(MouseeEvent e)方法完成的

DISCALIMER:

这是我以前做的一个测试项目,如果我现在就开始做,我会做得更干净利落一点,但我希望这能帮助你解决问题

如果你需要用一种类似养老金的功能性来画“自由之手”,这并不能真正涵盖它,除非你能建立在逻辑的基础上。“图形”有点模糊……)

但普林在如何创建圆点方面提供了一些帮助。我建议创建一个二维数组,这样您就可以添加反向选项:)

  • 不要使用
    JPanel#paint
    ,建议使用
    JPanel#paintComponent
    ,请查看
  • 使用适当的布局管理器。你的问题来自两个方面。首先,您的面板没有首选大小。重写
    Class2
    getPreferredSize
    方法,并返回布局管理器的适当大小

  • 1) 为了更快地获得更好的帮助,请发布一个。2) 为属性提供合理的名称。1)“扩展JPanel{public void paint(Graphics g){”用于
    JComponent
    中的自定义绘制,重写
    paintComponent(Graphics)
    而不是
    paint(Graphics)
    。2)
    f.setLayout(null);
    而不是布局内容并调用
    pack()
    。3)使用合理的类名(1级非常混乱)4)Class2没有首选大小,在将其添加到父级之前,您也没有为其指定任何大小。我看不出这如何回答OP的问题,甚至无法解决OP已演示的基本问题…感谢您回答我的第一个问题!感谢您的回答,但我似乎感到困惑。什么是最重要的?什么是最重要的“重写Class2的getPreferredSize方法,并返回布局管理器的适当大小"?我只有13岁…覆盖是一个与继承相关的术语。基本上它意味着覆盖专利方法的功能。查看更多详细信息感谢您的回答!这很有帮助!我已经解决了问题。一个是您所说的,没有首选大小。另一个是,当我向JPanel添加一些内容时,我得到了要将其添加到a之前,请将JFrame设置为可见。感谢大家的支持