Java 如何创建使用多个类创建图形的单个drawingpanel

Java 如何创建使用多个类创建图形的单个drawingpanel,java,class,graphics,Java,Class,Graphics,我在寻找一个起点,而不是答案,更多的是试图理解这个概念。如何将所有窗口仅放在一个面板/窗口上 创建FacebookPerson: public class FacebookPerson{ private String myName; protected String myMood; protected Facebook myfacebook; public FacebookPerson(String name){ myName = name; myfacebook = new Fac

我在寻找一个起点,而不是答案,更多的是试图理解这个概念。如何将所有窗口仅放在一个面板/窗口上

创建
FacebookPerson

public class FacebookPerson{

private String myName;
protected String myMood;
protected Facebook myfacebook;

public FacebookPerson(String name){
  myName = name;
  myfacebook = new Facebook(myName);
  //System.out.println("FacebookPerson_Graphics's constructor");
}

public FacebookPerson(){

}

public String getName(){
  return myName;
}

public void setMood(String newMood){
 myMood = newMood;
 myfacebook.setContent(myMood);
}

public String getMood(){
  return myMood;
}

}
这是创建和编辑以下内容的代码:

package facebook;

import java.awt.*;

public class Facebook{

private String name;
private String content;
DrawingPanel panel;
private Graphics g;

public Facebook(String nm){
   content = "undefined";
   name = nm;

   // Create the drawing panel
   panel =new DrawingPanel(200,150);
   g = panel.getGraphics();
   // display name
   g.drawString(name+"'s mood is undefined.", 20, 75);
  }

public void setContent(String newContent){
content = newContent;
    if(content.equals("happy")){
        g.setColor(Color.red);
        g.fillRect(0, 0, 200, 150);
        g.setColor(Color.black);
        // display mood
        g.drawString(name+"'s mood is:"+ "happy", 20, 75);
    }
    else{
        g.setColor(Color.white);
        g.fillRect(0, 0, 200, 150);
        g.setColor(Color.black);
        g.drawString(name+"'s mood is:"+ content, 20, 75);
    }
 }

      public String getContent(){
        return content;
  }



}
创建用户界面以实现两个类:

 package facebook;

 import java.util.*;

 public class testFacebook{


 public static void main (String[] args){

// Prompt user to enter the number of facebookpresons
Scanner userInput = new Scanner(System.in);
System.out.println("Enter the number of facebookpresons to be created: ");
int numP=0;
while(true){
    try{
        numP = userInput.nextInt();
        userInput.nextLine();
        if(numP>0 && numP<=9)  // accept the number if it is within range. Here we define the range to be from 1 to 5. 
            break;
        else
            System.out.println("the number is out of range [1, 9]! enter again");
    } catch (InputMismatchException e){
        System.out.println("invalid input. Enter an integer number!");
        userInput.nextLine();
    }
}

FacebookPerson[] fbp = new FacebookPerson[numP];

//Ask the user to enter the name for each person, and create the persons
for(int i=0; i< numP; i++){
    System.out.println("Enter the name for person "+ (i+1)+ ":");
    String name = userInput.nextLine();
    fbp[i] = new FacebookPerson(name);
}
System.out.println("-------select a person and type the mood below--------");

//Ask the user to set the mood for a person, and update the mood, enter "####" to exit
while(true){
    System.out.println("Enter the name for a person (enter #### to exit):");
    String name = userInput.nextLine();
    if(name.equals("####"))
         System.exit(0);
    int personID = -1;
    for(int i=0; i< numP; i++){
        if(fbp[i].getName().equals(name)){
            personID = i;
            break;  // break the for loop
        }
    }
    if(personID!=-1){  // found the person, otherwise personID should still be -1
        System.out.println("Enter the mood for the person:");
        String mood = userInput.nextLine();
        fbp[personID].setMood(mood);
    }
    else
        System.out.println("unrecognized name!");
} // end while

} // end main

}
package-facebook;
导入java.util.*;
公共类测试Facebook{
公共静态void main(字符串[]args){
//提示用户输入FaceBookPreson的数量
扫描仪用户输入=新扫描仪(System.in);
System.out.println(“输入要创建的FaceBookPreson的数量:”;
int numP=0;
while(true){
试一试{
numP=userInput.nextInt();
userInput.nextLine();

如果(numP>0&&numP让我们从不执行
g=panel.getGraphics();
开始,这不是自定义绘制的工作方式。请查看并获取有关如何进行绘制的更多详细信息

首先定义一个“可绘制”或“可绘制”的概念(使用一个接口定义一个入口点,通过该入口点可以绘制可以绘制的东西)

您希望在“可绘制表面”上绘制的任何内容都应该实现此接口

创建一个“可绘制的曲面”,它可以获取一个
可绘制的
对象列表,然后绘制它们

public class DrawablePane extends JPanel {
    private List<Drawable> drawables;

    public DrawablePane() {
        drawables = new ArrayList<>(25);
    }

    public void add(Drawable drawable) {
        drawables.add(drawable);
        repaint();
    }

    public void remove(Drawable drawable) {
        drawables.remove(drawable);
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        for (Drawable drawable : drawables) {
            Graphics2D g2d = (Graphics2D)g.create();
            drawable(g2d, this);
            g2d.dispose();
        }
    }
}
公共类DrawablePane扩展了JPanel{
私人名单提款;
公共绘图窗格(){
可提取数据=新阵列列表(25);
}
公共空白添加(可提取){
可提取。添加(可提取);
重新油漆();
}
公共空间移除(可提取){
可抽式。移除(可抽式);
重新油漆();
}
@凌驾
受保护组件(图形g){
用于(可提取:可提取){
Graphics2D g2d=(Graphics2D)g.create();
可拉伸(g2d,本);
g2d.dispose();
}
}
}

作为一个想法…

让我们先不要做
g=panel.getGraphics();
,这不是自定义绘制的工作方式我知道我理解为什么不应该使用g=panel.getGraphics(),但我不理解接口的概念,我的教授还没有介绍。我建议你自己花点时间做一些研究。你可以使用简单的类,但接口更灵活
public class DrawablePane extends JPanel {
    private List<Drawable> drawables;

    public DrawablePane() {
        drawables = new ArrayList<>(25);
    }

    public void add(Drawable drawable) {
        drawables.add(drawable);
        repaint();
    }

    public void remove(Drawable drawable) {
        drawables.remove(drawable);
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        for (Drawable drawable : drawables) {
            Graphics2D g2d = (Graphics2D)g.create();
            drawable(g2d, this);
            g2d.dispose();
        }
    }
}