gpt4 book ai didi

Java 自己的组件通过拖放进行视觉连接

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:05 28 4
gpt4 key购买 nike

我正在为小型工作流编辑器开发软件解决方案。为此,我创建了一个自己的 JPanel,它具有删除自身或编辑主要信息等功能。

它是这样的:

Movable components

关键是,我需要一个像箭头之类的动态连接器。我用画线试过,但它不是动态的,看起来也不太好。我的意思是,如果我移动其中一个框,那么绘制的线也必须改变其位置。

大型 JPanel 中的框是可移动和可调整大小的。右边和左边的连接点是 JButton。该结构是任何传出连接都从右边开始,收入从左边开始 JButton

任何想法如何设置它?

我不能发布太多的源代码,因为该软件是为一家公司准备的。

最佳答案

您是否将 Graphics 对象转换为 Graphics2D并设置 RenderHints ?即

Graphics2D g2d=(Graphics2D)g;   
g2d.setRenderingHint(RenderHints.KEY_ANTIALIASING,RenderHints.VALUE_ANTIALIASING _ON);

这将添加一些不错的 anti aliasing效果,并可能使线条看起来更直。

同时通过 Graphics2D#setStroke 增加笔画宽度将使锯齿状边缘消失,因为它现在更厚了。

查看此示例(按下、拖动和释放鼠标以创建一条线):

g2d.setRenderingHint(..)paintComponent(..) 中的 g2d.setStroke(..) 注释掉了:

enter image description here

g2d.setRenderingHint(..)g2d.setStroke(..) 未注释:

enter image description here

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 将使我们能够测试并查看可能存在的问题/改进。

关于Java 自己的组件通过拖放进行视觉连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14279893/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com