有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing在两个java图形之间画一条可移动的线

How it looks

刺客通过一条线与气泡相连。例如,当我搬家的时候,吉米,我希望把吉米和他卖的水果连接起来的那条线能得到维护。我拖水果的时候也是一样

但不知怎么的,这是行不通的。当我拖动粘胶人或气泡时,线条变得脱节。 enter image description here

这里是我的代码,如果有人想尝试运行它。我试着只包括相关的东西

示例类

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example extends JPanel {

private static List<Person> persons;
private static List<Fruit> fruits;
private static List<LineTest> lines;
private Point mousePt;
private static Font setFont;
private Random randomGenerator;
private Person person;
private Fruit bubble;
private LineTest line;
private static final int W = 640;    
private static final int H = 480; 

public Example() {
    persons = new ArrayList<Person>();  // Stores the person's names & coords
    fruits = new ArrayList<Fruit>(); // Stores the person's name and what fruits he sells & coords
    lines = new ArrayList<LineTest>(); // Stores the person's name, fruits he sells & coords
    randomGenerator = new Random();
    setFont = new Font("Sans Serif", Font.BOLD, 12);

    String person1 = "Jimmy";
    String person2 = "Sally";

    person = new Person(person1, 50,50);
    addPerson(person);
    person = new Person(person2, 50,150);
    addPerson(person);

    String fruit1 = "Banana";
    String fruit2 = "Apple";
    String fruit3 = "Orange";
    String fruit4 = "Watermelon";
    String fruit5 = "Pineapple";
    String fruit6 = "Grapes";

    bubble = new Fruit(person1, fruit1, setFont, 150, 50);
    addFruit(bubble);
    bubble = new Fruit(person1, fruit2, setFont, 150, 100);
    addFruit(bubble);
    bubble = new Fruit(person1, fruit3, setFont, 150, 150);
    addFruit(bubble);
    bubble = new Fruit(person2, fruit4, setFont, 150, 200);
    addFruit(bubble);
    bubble = new Fruit(person2, fruit5, setFont, 150, 250);
    addFruit(bubble);
    bubble = new Fruit(person2, fruit6, setFont, 150, 300);
    addFruit(bubble);

    for (int i=0; i<persons.size();i++) {
        for (int j=0; j<fruits.size();j++) {
            // If the same person in the person's list can be found in the fruits list
            // draw a line between the Person and the Fruit
            if (persons.get(i).getPerson().equals((fruits.get(j).getPerson()))) {
                int personX = persons.get(i).getCoorX();
                int personY = persons.get(i).getCoorY();
                int fruitX = fruits.get(j).getCoorX();
                int fruitY = fruits.get(j).getCoorY();
                line = new LineTest(persons.get(i).getPerson(), fruits.get(j).getFruit(), personX, personY, fruitX, fruitY);
                addLine(line);
            }
        }
    } 

    this.setFont(setFont);    
    this.addMouseListener(new MouseAdapter() {    
        @Override    
        public void mousePressed(MouseEvent e) {    
            mousePt = e.getPoint();  
            for (Person p:persons) {  
                p.select(mousePt.x, mousePt.y);
            }  

            for (Fruit f:fruits) {
                f.select(mousePt.x, mousePt.y);
            }
        }  

        public void mouseReleased(MouseEvent e) {  
            for (Person p:persons) {
                p.unselect();
            }

            for(Fruit f:fruits) {
                f.unselect();
            }
        }  
    });    
    this.addMouseMotionListener(new MouseMotionAdapter() {    

        @Override    
        public void mouseDragged(MouseEvent e) {    
            mousePt = e.getPoint();  
            for (Person s:persons) {
                s.move(mousePt.x, mousePt.y);
                int personX = mousePt.x;
                int personY = mousePt.y;
                for(int k=0; k<lines.size(); k++) {
                    // If the same person in the person's list can be found in the fruits list
                    // move the point on the Person to a new coords
                    if(s.person.equals(lines.get(k).person)) {
                        lines.get(k).move(personX, personY);
                    }
                }
            }

            for(Fruit f:fruits) {
                f.move(mousePt.x, mousePt.y);
                int fruitX = mousePt.x;
                int fruitY = mousePt.y;
                for(int k=0; k<lines.size(); k++) {
                    if(f.person.equals(lines.get(k).person)) {
                        lines.get(k).move(fruitX, fruitY);
                    }
                }
            }
            repaint();    
        }    
    }); 
}

public void addPerson(Person person) {    
    persons.add(person);  
    repaint();    
} 

public void addFruit (Fruit fruit) {    
    fruits.add(fruit);    
    repaint();    
} 

public void addLine(LineTest line) {
    lines.add(line);
    repaint();
}

@Override    
public void paintComponent(Graphics g) {    
    super.paintComponent(g);  
    Graphics2D g2 = (Graphics2D)g.create();

    for (Person p:persons) {    
        p.paint(g2); 
    }   
    for (LineTest l:lines) {
        l.paint(g2);
    }
    for (Fruit f:fruits) {    
        f.paint(g2);
    } 
}    

@Override    
public Dimension getPreferredSize() {    
    return new Dimension(W, H);    
}    

public static void main(String[] args) {    
    EventQueue.invokeLater(new Runnable() {    
        @Override    
        public void run() {    
            JFrame f = new JFrame();    
            f.add(new Example());    
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
            f.pack();    
            f.setLocationRelativeTo(null);    
            f.setVisible(true);     
        }    
    });    
}    
}

个人类

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;

public class Person extends Rectangle {    
String person;
int x,y;  
int tx, ty;  
boolean isSelected = false;

public Person(String person, int x, int y) {  
    this.person = person;
    this.x = x;  
    this.y = y; 
    this.setBounds(x-10,y-10,40,90);

    isSelected = true;  
    move(x, y);  
    isSelected = false;  
}  

public void select(int x, int y){
    if(this.contains(x,y)) {
        isSelected=true; 
    } 
}  

public void unselect(){  
    isSelected = false;  
}

public void move(int x, int y) {  
    if(isSelected) {  
        LineTest.isPersonMoved = true;
        LineTest.isFruitMoved = false;
        tx = x;  
        ty= y;  
        this.translate(tx-this.x, ty-this.y); 
        this.x = tx;  
        this.y = ty;  
    }  
}  

public void paint(Graphics g) {  
    Graphics2D g2 = (Graphics2D)g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.drawOval(x, y, 20, 20); // head
    g2.drawLine(x+10,y+20,x+10,y+50); // body
    g2.drawLine(x+10,y+20,x+25,y+40); // right hand
    g2.drawLine(x+10,y+20,x-5,y+40); // left hand
    g2.drawLine(x+10,y+50,x-5,y+70); // left leg
    g2.drawLine(x+10,y+50,x+25,y+70); // right leg
    g2.drawString(person, tx-15, ty+85);
}  

public String getPerson() {
    return person;
}

public int getCoorX() {
    return x;
}

public int getCoorY() {
    return y;
}
} 

水果类

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;

public class Fruit extends Rectangle {

private static final long serialVersionUID = 1L;
String fruit, person;
Font _font;
int x, y, tx, ty;
public static int height, width, ovalWidth, ovalHeight;
boolean isSelected;
public static FontMetrics getMetrics;
public static Graphics2D g2;

public Fruit(String person, String fruit, Font font, int x, int y) {
    this.person = person;
    this.fruit = fruit;
    this._font = font;
    this.x = x;
    this.y = y;
    this.setBounds(x, y, ovalWidth, ovalHeight);

    isSelected = true;  
    move(x, y);  
    isSelected = false; 

}

public void select(int x, int y){
    if(this.contains(x,y)) {
        isSelected=true; 
    } 
} 

public void unselect(){  
    isSelected = false;  
}

public void move(int x, int y) {  
    if(isSelected) {  
        LineTest.isPersonMoved = false;
        LineTest.isFruitMoved = true;

        tx = x;  
        ty= y;  
        this.translate(tx-this.x, ty-this.y);
        this.x = tx;  
        this.y = ty;  
    }  
} 

public void paint(Graphics g) {
    g2 = (Graphics2D) g.create();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    getMetrics = g2.getFontMetrics(_font);
    height = getMetrics.getHeight();
    width = getMetrics.stringWidth(fruit);

    ovalWidth = width+25;
    ovalHeight = height+25;
    g2.setColor(Color.WHITE);
    g2.fillOval(x, y, ovalWidth, ovalHeight);
    g2.setColor(Color.BLACK);
    g2.drawOval(x, y, ovalWidth, ovalHeight);

    int centreX = x + ovalWidth/2;
    int centreY = y + ovalHeight/2;
    g2.drawString(fruit, (int) (centreX - width/2), (int) (centreY + height/4));

    this.setBounds(x, y, ovalWidth, ovalHeight);
}

public String getPerson() {
    return person;
}

public String getFruit() {
    return fruit;
}

public int getCoorX() {
    return x;
}

public int getCoorY() {
    return y;
}

}

线路测试类

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;

/*
 * Draw line that connect between Person and Fruit
 */
public class LineTest {
int x1, y1, x2, y2, tx, ty;
String fruit, person;
public static boolean isPersonMoved, isFruitMoved;

public LineTest(String person, String fruit, int x1, int y1, int x2, int y2) {
    this.person = person;
    this.fruit = fruit;

    // Get x, y coordinates from person bound
    this.x1 = x1+35;
    this.y1 = y1+35;

    // Get x, y coordinates from fruit bound
    this.x2 = x2+30;
    this.y2 = y2+30;  
}

public void move(int x, int y) {
    if (isPersonMoved) {
        System.out.println("LineTest - isPersonMoved: " + isPersonMoved);
        tx = x;
        ty = y;
        this.x1 = tx+35;
        this.y1 = ty+35;
    } else if (isFruitMoved) {
        System.out.println("LineTest - isFruitMoved: " + isFruitMoved);
        tx = x;
        ty = y;
        this.x2 = tx+30;
        this.y2 = ty+30;
    }
}

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D)g.create();
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.drawLine(x1, y1, x2, y2);
}

public String getPerson() {
    return person;
}

public String getFruit() {
    return fruit;
}

public Point getFstCoor() {
    return new Point (x1, y1);
}

public Point getSndCoor() {
    return new Point(x2, y2);
}
}

共 (0) 个答案