我正在为一个小型工作流编辑器开发软件解决方案。为此,我创建了一个自己的JPanel
,其中包含删除自身或编辑主要信息等功能。
它的外观如下:
关键是,我需要像箭头之类的动态连接器。 我尝试使用drawline,但它没有动态,看起来不太好。我的意思是如果我移动其中一个方框,那么画线也必须改变它的位置。
大JPanel
中的框可移动且可调整大小。左右连接点为JButton
s。结构是任何传出连接都从右边开始,收入从左边JButton
开始。
任何想法如何设置?
我无法发布大部分源代码,因为该软件适用于公司。
答案 0 :(得分:3)
您是否将Graphics
对象转换为Graphics2D
并设置了RenderHints
?即
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderHints.KEY_ANTIALIASING,RenderHints.VALUE_ANTIALIASING _ON);
这将添加一些不错的anti aliasing效果,并可能使线条外观更直。
通过Graphics2D#setStroke
增加笔画宽度会使jaggeder边缘消失,因为它现在更厚了。
请参阅此示例(按,拖动并释放鼠标以创建一行):
g2d.setRenderingHint(..)
内的g2d.setStroke(..)
和paintComponent(..)
已注明:
取消注释g2d.setRenderingHint(..)
和g2d.setStroke(..)
:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test gui = new Test();
}
});
}
public Test() {
initComponents();
}
private void initComponents() {
JFrame frame = new JFrame("Line Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MyPanel());
frame.pack();
frame.setVisible(true);
}
}
class MyPanel extends JPanel {
Point point1;
Point point2;
Line2D line2d;
public MyPanel() {
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent me) {
super.mousePressed(me);
point1 = me.getPoint();
}
});
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent me) {
super.mouseDragged(me);
point2 = me.getPoint();
line2d = new Line2D.Double(point1, point2);
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//Set anti-alias!
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (point1 != null && point2 != null) {
g2d.setPaint(Color.RED);
g2d.setStroke(new BasicStroke(1.5f));//set stroke size
g2d.draw(line2d);
}
}
}
如果上面没有帮助,发布SSCCE将使我们能够测试并查看可能出现故障/使其更好。