[英]How to draw Graphics2D on JPanel which is inside another JPanel?
[英]How to draw a line from a jpanel to another jpanel
我有两个JPanels,我想单击第一个面板,然后单击第二个面板,并在两个面板之间绘制一条直线。 放置后,该线还必须在两个面板之间保持不变。 有人可以给我小费的起点吗? 这两个面板位于第三个面板上,它们是下图中的蓝色矩形。 先感谢您。 //父级JPanels
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
class WorkflowPanel extends JPanel {
private volatile int screenX = 0;
private volatile int screenY = 0;
private static final int RADIUS = 35;
private int radius = RADIUS;
private ArrayList<ModelView> relationship;
WorkflowPanel() {
relationship = new ArrayList<>();
relationship.add(new ModelView());
relationship.add(new ModelView());
add(relationship.get(0));
add(relationship.get(1));
setLayout(null);
setVisible(true);
}
@Override
protected void paintChildren(Graphics g) {
for (int i = 0; i < relationship.size(); i += 2) {
ModelView one = relationship.get(i);
ModelView two = relationship.get(i + 1);
Point p1 = new Point(one.getLocation().x + one.getWidth() / 2, one.getLocation().y + one.getHeight() / 2);
Point p2 = new Point(two.getLocation().x + two.getWidth() / 2, two.getLocation().y + two.getHeight() / 2);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
this.repaint();
}
super.paintChildren(g);
}
public ArrayList<ModelView> getRelationship() {
return relationship;
}
}
// Draggable Jpanels
import javax.swing.*;
import javax.swing.border.*;
class ModelView extends JPanel {
private volatile int screenX = 0;
private volatile int screenY = 0;
private volatile int myX = 0;
private volatile int myY = 0;
private JLabel modelLbl;
public ModelView() {
setBorder(new LineBorder(new Color(128, 149, 255), 2));
setBackground(Color.WHITE);
setBounds(0, 0, 150, 75);
setOpaque(false);
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
modelLbl = getLabel("DecisionTree");
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
});
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) { }
@Override
public void mousePressed(MouseEvent e) {
screenX = e.getXOnScreen();
screenY = e.getYOnScreen();
myX = getX();
myY = getY();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
});
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
int deltaX = e.getXOnScreen() - screenX;
int deltaY = e.getYOnScreen() - screenY;
setLocation(myX + deltaX, myY + deltaY);
e.getComponent().repaint();
// Repaint the parent component
workflowPanel.repaint();
}
@Override
public void mouseMoved(MouseEvent e) { }
});
}
private JLabel getLabel(String labelText) {
JLabel label = new JLabel(labelText);
label.setFont(new Font("Verdana", Font.PLAIN, 10));
return label;
}
public JPanel getPanel() {
return this;
}
}
有人可以给我小费的起点吗?
父面板需要知道子面板之间的关系。
一种方法是保留ArrayList
来跟踪成对的组件之间的关系。 然后,您将需要覆盖父面板的paintChildren(...)
方法,以在两个孩子之间画一条线。
您可以在父面板类中定义ArrayList:
private ArrayList<Component> relationships = new ArrayList<Component>();
然后根据需要将成对的组件添加到ArrayList中:
relationships.add( component1a );
relationships.add( component1b );
基本绘画代码为:
@Override
protected void paintChildren(Graphics g)
{
for (int i = 0; i < relationships.size(); i += 2)
{
Component one = relationships.get(i);
Component two = relationships.get(i + 1);
Point p1 = //calculate the center of component one
Point p2 = //calculate the center of component two
g.drawline(p1.x, p1.y, p2.x, p2.y);
}
super.paintChildren(g);
}
因此,上面的代码应在您添加到ArrayList的每对组件的中心点之间绘制线。 然后,子面板将绘制在线条的顶部,以便线条看起来像从每个组件的边缘出来。
退房trashgod的GraphPanel例子。 此示例支持拖动形状,线条将跟随形状。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.