![](/img/trans.png)
[英]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.