行没有出现在JDesktopPane上 [英] Line not appearing on JDesktopPane
问题描述
我想在两个JPanel之间绘制线条,但是line不会出现在layeredPane上。
I want to draw line between two JPanels but line is not appearing on layeredPane.
这就是我所做的,请完成它,编译。试试吧更正此代码。我试过这种方式在内部框架上绘制线条,但它不适用于JPanels。
This is what i have done please go through it, compilable.Do try and correct this code. I have tried on drawing lines on Internal frames this way but it is not working for JPanels.
package build;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class LinkLayerPane1 {
public static void main(String[] args) {
new LinkLayerPane1();
}
public LinkLayerPane1() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JLayeredPane layer = new JLayeredPane();
JPanel red = new JPanel();
red.setBackground(Color.RED);
JPanel blue = new JPanel();
blue.setBackground(Color.BLUE);
red.setBounds(50, 50, 50, 50);
blue.setBounds(125, 125, 50, 50);
layer.add(red);
layer.add(blue);
Point Red= new Point();
Red.x=red.getX()+(red.getWidth()/2);
Red.y=red.getY()-(red.getHeight()/2);
Point Blue= new Point();
Blue.x=blue.getX()+(blue.getWidth()/2);
Blue.y=blue.getY()-(blue.getHeight()/2);
handleDrag(red,Blue);
handleDrag(blue,Red);
layer.add(new LinkPane(red, blue), new Integer(JLayeredPane.DEFAULT_LAYER + 1));
layer.setPreferredSize(new Dimension(250, 250));
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(layer);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class LinkPane extends JPanel {
private Point startPoint;
private Point endPoint;
public LinkPane(JPanel panel1, JPanel panel2) {
setOpaque(false);
Point p1 = panel1.getLocation();
Point p2 = panel2.getLocation();
startPoint = new Point();
endPoint = new Point();
Point from = new Point();
Point to = new Point();
if (p1.x < p2.x) {
from.x = p1.x + (panel1.getWidth() / 2);
to.x = p2.x + (panel2.getWidth() / 2);
} else {
from.x = p2.x + (panel2.getWidth() / 2);
to.x = p1.x + (panel1.getWidth() / 2);
startPoint.x = p2.x;
}
if (p1.y < p2.y) {
from.y = p1.y + (panel1.getHeight()/ 2);
to.y = p2.y + (panel2.getHeight()/ 2);
} else {
from.y = p2.y + (panel2.getHeight()/ 2);
to.y = p1.y + (panel1.getHeight()/ 2);
}
int width = Math.max(1, to.x - from.x);
int height = Math.max(1, to.y - from.y);
setLocation(from);
setSize(width, height);
System.out.println(getBounds());
if (p1.x < p2.x) {
startPoint.x = 0;
endPoint.x = getWidth();
} else {
startPoint.x = getWidth();
endPoint.x = 0;
}
if (p1.y < p2.y) {
startPoint.y = 0;
endPoint.y = getHeight();
} else {
startPoint.y = getHeight();
endPoint.y = 0;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
g2d.dispose();
}
}
//Dragging
public static void handleDrag(final JPanel Tpanel,final Point to)
{
final JPanel p = Tpanel;
Tpanel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent me) {
me.translatePoint(me.getComponent().getLocation().x, me.getComponent().getLocation().y);
//Handling Panel Dragging
p.setLocation(me.getX(), me.getY());
//Finding new point
Point p1 = Tpanel.getLocation();
Point p2=to;
Point startPoint = new Point();
Point endPoint = new Point();
Point from = new Point();
if (p1.x < p2.x) {
from.x = p1.x + (Tpanel.getWidth() / 2);
to.x = p2.x + (Tpanel.getWidth() / 2);
} else {
from.x = p2.x + (Tpanel.getWidth() / 2);
to.x = p1.x + (Tpanel.getWidth() / 2);
startPoint.x = p2.x;
}
if (p1.y < p2.y) {
from.y = p1.y + (Tpanel.getHeight()/ 2);
to.y = p2.y + (Tpanel.getHeight()/ 2);
} else {
from.y = p2.y + (Tpanel.getHeight()/ 2);
to.y = p1.y + (Tpanel.getHeight()/ 2);
}
int width = Math.max(1, to.x - from.x);
int height = Math.max(1, to.y - from.y);
if (p1.x < p2.x) {
startPoint.x = 0;
endPoint.x = Tpanel.getWidth();
} else {
startPoint.x = Tpanel.getWidth();
endPoint.x = 0;
}
if (p1.y < p2.y) {
startPoint.y = 0;
endPoint.y = Tpanel.getHeight();
} else {
startPoint.y = Tpanel.getHeight();
endPoint.y = 0;
}
}
});
}
}
推荐答案
我很困惑。您从 JDesktop
扩展您的课程,但继续将其添加到 JLayedPane
... JDesktop
扩展。
I'm confused. You extend your class from JDesktop
, but then proceed to add it to a JLayedPane
...JDesktop
extends.
默认情况下没有布局管理器, JDesktopPane
将被添加到 JLayeredPane
,大小为0x0 ..
Without a layout manger by default, the JDesktopPane
will be added to the JLayeredPane
with a size of 0x0..
我不确定你希望通过这个实现目标。
I'm not sure what you hoped to achieve by this.
使用示例更新
您面临的问题是 paintComponent
将始终在组件下绘制,而 paint
理论上将绘制组件,它可以从更新中排除(作为 RepaintManager
可以指向需要更新的组件。
The problem(s) you are facing is that paintComponent
will always paint under the components, while paint
in theory will paint over the components, it can be excluded from updates (as the RepaintManager
can go direct the component that needs to be updated).
虽然我仍然认为使用玻璃窗格是最简单的解决方案,如所示此处,您只需添加一个图层窗格即可连接窗格,从一个点到另一个点绘制一条线,只需将其添加到 LayeredPane
...
While I still think using the glass pane is the simplest solution, as demonstrated here, you could simply take advantage of the layer pane by adding a "connect" pane that draws a line from one point to another and simply add it to the LayeredPane
...
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class LinkLayerPane {
public static void main(String[] args) {
new LinkLayerPane();
}
public LinkLayerPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JLayeredPane layer = new JLayeredPane();
JPanel red = new JPanel();
red.setBackground(Color.RED);
JPanel blue = new JPanel();
blue.setBackground(Color.BLUE);
red.setBounds(50, 50, 50, 50);
blue.setBounds(125, 125, 50, 50);
layer.add(red);
layer.add(blue);
layer.add(new LinkPane(red, blue), new Integer(JLayeredPane.DEFAULT_LAYER + 1));
layer.setPreferredSize(new Dimension(250, 250));
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(layer);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class LinkPane extends JPanel {
private Point startPoint;
private Point endPoint;
public LinkPane(JPanel panel1, JPanel panel2) {
setOpaque(false);
Point p1 = panel1.getLocation();
Point p2 = panel2.getLocation();
startPoint = new Point();
endPoint = new Point();
Point from = new Point();
Point to = new Point();
if (p1.x < p2.x) {
from.x = p1.x + (panel1.getWidth() / 2);
to.x = p2.x + (panel2.getWidth() / 2);
} else {
from.x = p2.x + (panel2.getWidth() / 2);
to.x = p1.x + (panel1.getWidth() / 2);
startPoint.x = p2.x;
}
if (p1.y < p2.y) {
from.y = p1.y + (panel1.getHeight()/ 2);
to.y = p2.y + (panel2.getHeight()/ 2);
} else {
from.y = p2.y + (panel2.getHeight()/ 2);
to.y = p1.y + (panel1.getHeight()/ 2);
}
int width = Math.max(1, to.x - from.x);
int height = Math.max(1, to.y - from.y);
setLocation(from);
setSize(width, height);
System.out.println(getBounds());
if (p1.x < p2.x) {
startPoint.x = 0;
endPoint.x = getWidth();
} else {
startPoint.x = getWidth();
endPoint.x = 0;
}
if (p1.y < p2.y) {
startPoint.y = 0;
endPoint.y = getHeight();
} else {
startPoint.y = getHeight();
endPoint.y = 0;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
g2d.dispose();
}
}
}
现在拖动
请记住,鼠标事件是相对于 MouseListener
注册的组件的。也就是说,如果您将 MosueListener
注册到 JLayeredPane
中的任何组件,鼠标事件将被转换为相对于那里的坐标空间。这可能会让生活变得有点混乱。
Now with dragging
Remember, mouse events a relative to the component that MouseListener
is registered to. That is, if you register the MosueListener
to any of the components within the JLayeredPane
, the mouse events will be translated to be relative to there coordinate space. This can make life a little confusing.
这个例子做了两个重大改变。
This example makes two significant changes.
- 它将
Mouse / MotionListener
添加到JLayeredPane
。然后,这个监听器处理找出点击的内容并管理流程 -
移动
LinkPane的设置代码
到updateLinks
方法。LinkPane
然后将ComponentListener
注册到它链接到的每个面板,并在位置或大小时更新链接更改......
- It adds a
Mouse/MotionListener
to theJLayeredPane
. This listener then deals with figuring out what was clicked and managing the process Moves the "setup" code for the
LinkPane
to aupdateLinks
method. TheLinkPane
then registers aComponentListener
to each of the panels it is linking to and updates the link when there position or size changes...
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException;
public class LinkLayerPane {
public class LinkLayerPane {
public static void main(String[] args) {
new LinkLayerPane();
}
public LinkLayerPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JLayeredPane layer = new JLayeredPane();
JPanel red = new JPanel();
red.setBackground(Color.RED);
JPanel blue = new JPanel();
blue.setBackground(Color.BLUE);
red.setBounds(50, 50, 50, 50);
blue.setBounds(125, 125, 50, 50);
layer.add(red);
layer.add(blue);
layer.add(new LinkPane(red, blue), new Integer(JLayeredPane.DEFAULT_LAYER + 1));
layer.setPreferredSize(new Dimension(250, 250));
MouseAdapter ma = new MouseAdapter() {
private Point offset;
private Component dragComponent;
@Override
public void mousePressed(MouseEvent e) {
JLayeredPane layer = (JLayeredPane) e.getComponent();
dragComponent = layer.getComponentAt(e.getPoint());
if (dragComponent != null && !dragComponent.equals(layer) && !(dragComponent instanceof LinkPane)) {
offset = e.getPoint();
offset.x = dragComponent.getX() - offset.x;
offset.y = dragComponent.getY() - offset.y;
} else {
dragComponent = null;
}
}
@Override
public void mouseReleased(MouseEvent e) {
dragComponent = null;
offset = null;
}
@Override
public void mouseDragged(MouseEvent e) {
if (dragComponent != null) {
Point dragTo = e.getPoint();
dragTo.x += offset.x;
dragTo.y += offset.y;
dragComponent.setLocation(dragTo);
}
}
};
layer.addMouseListener(ma);
layer.addMouseMotionListener(ma);
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(layer);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class LinkPane extends JPanel {
private Point startPoint;
private Point endPoint;
private JPanel[] links;
public LinkPane(JPanel panel1, JPanel panel2) {
setOpaque(false);
links = new JPanel[]{panel1, panel2};
ComponentAdapter ca = new ComponentAdapter() {
@Override
public void componentMoved(ComponentEvent e) {
updateLinks();
}
@Override
public void componentResized(ComponentEvent e) {
updateLinks();
}
};
links[0].addComponentListener(ca);
links[1].addComponentListener(ca);
updateLinks();
}
protected void updateLinks() {
Point p1 = links[0].getLocation();
Point p2 = links[1].getLocation();
startPoint = new Point();
endPoint = new Point();
Point from = new Point();
Point to = new Point();
if (p1.x < p2.x) {
from.x = p1.x + (links[0].getWidth() / 2);
to.x = p2.x + (links[1].getWidth() / 2);
} else {
from.x = p2.x + (links[1].getWidth() / 2);
to.x = p1.x + (links[0].getWidth() / 2);
startPoint.x = p2.x;
}
if (p1.y < p2.y) {
from.y = p1.y + (links[0].getHeight() / 2);
to.y = p2.y + (links[1].getHeight() / 2);
} else {
from.y = p2.y + (links[1].getHeight() / 2);
to.y = p1.y + (links[0].getHeight() / 2);
}
int width = Math.max(1, to.x - from.x);
int height = Math.max(1, to.y - from.y);
setLocation(from);
setSize(width, height);
System.out.println(getBounds());
if (p1.x < p2.x) {
startPoint.x = 0;
endPoint.x = getWidth();
} else {
startPoint.x = getWidth();
endPoint.x = 0;
}
if (p1.y < p2.y) {
startPoint.y = 0;
endPoint.y = getHeight();
} else {
startPoint.y = getHeight();
endPoint.y = 0;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2d.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
g2d.dispose();
}
}
}
这篇关于行没有出现在JDesktopPane上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!