Java在绘制线条时使用jpanel和jscrollpane

Java在绘制线条时使用jpanel和jscrollpane,java,swing,user-interface,jpanel,jscrollpane,Java,Swing,User Interface,Jpanel,Jscrollpane,我开发了一个可视化连接Java组件的软件解决方案,效果很好。我现在唯一的问题是我的仪表板被一个jscrollpane包围,这很好。但是,如果我离开仪表板,使jscrollpane必须增长,那么所有用于连接组件的线都会从它们的位置移动。我已经搜索了一些方法来获取jscollpane的真实屏幕大小,但没有找到任何结果 要在需要时扩展jscrollpane,我使用: Point p = (mainPanel.getMousePosition()); if(mainPanel.getWidth() -

我开发了一个可视化连接Java组件的软件解决方案,效果很好。我现在唯一的问题是我的仪表板被一个jscrollpane包围,这很好。但是,如果我离开仪表板,使jscrollpane必须增长,那么所有用于连接组件的线都会从它们的位置移动。我已经搜索了一些方法来获取jscollpane的真实屏幕大小,但没有找到任何结果

要在需要时扩展jscrollpane,我使用:

Point p = (mainPanel.getMousePosition());
if(mainPanel.getWidth() - (p.x) < tmp.getWidth() && mainPanel.getHeight() - (p.y) < tmp.getHeight())
{
    dim = new Dimension(dim.width+(mainPanel.getWidth()-p.x),dim.height+mainPanel.getHeight() - (p.y));
}
else if(mainPanel.getHeight() - (p.y) < tmp.getHeight())
{
    dim = new Dimension(dim.width,dim.height+mainPanel.getHeight() - (p.y));
}
else if(mainPanel.getWidth() - (p.x) < tmp.getWidth())
{
    dim = new Dimension(dim.width+(mainPanel.getWidth()-p.x),dim.height);
}
mainPanel.setPreferredSize(dim);
p点=(mainPanel.getMousePosition());
if(mainPanel.getWidth()-(p.x)
当鼠标被拖动时

因此,我需要在jscrollpane中获得左上角点的坐标,以计算新的坐标或将直线向后移动的东西

要绘制我使用的线:

@Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;

    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

    // test
    Line2D tmp_line;
    for (int i = 0; i < abuttons.size(); i++) {
        // System.out.println(abuttons.get(i).out);
        if (abuttons.get(i).out != null) {
            int x1 = abuttons.get(i).getLocation().x
                    + abuttons.get(i).connectBtn_right.getLocation().x 
                    + 12;
            int y1 = abuttons.get(i).getLocation().y
                    + abuttons.get(i).connectBtn_right.getLocation().y 
                    + 9 + 75;
            int x2 = abuttons.get(i).out.getLocation().x
                    + abuttons.get(i).out.connectBtn_left.getLocation().x
                    + 12;
            int y2 = abuttons.get(i).out.getLocation().y
                    + abuttons.get(i).out.connectBtn_left.getLocation().y
                    + 9 + 75;

            tmp_line = new Line2D.Double(x1, y1, x2, y2);
            g2d.setPaint(Color.BLACK);
            g2d.setStroke(new BasicStroke(1.5f));
            g2d.draw(tmp_line);
        }
    }
    if (point1 != null && point2 != null) {
        line2d = new Line2D.Double(point1, point2);
        g2d.setPaint(Color.RED);
        g2d.setStroke(new BasicStroke(1.5f));// set stroke size
        g2d.draw(line2d);
    }
}
@覆盖
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
//试验
Line2D tmp_线;
对于(int i=0;i
谢谢你的帮助

以下是SSCCE:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JScrollPane;
import javax.swing.JButton;


public class LineDraw extends JFrame {

private JPanel contentPane;
JScrollPane scrollPane = new JScrollPane();
JPanel panel = new JPanel();
JButton btnNewButton = new JButton("New button");
JButton btnNewButton_1 = new JButton("New button");

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                LineDraw frame = new LineDraw();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public LineDraw() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    scrollPane.setBounds(0, 0, 424, 251);
    contentPane.add(scrollPane);

    scrollPane.setViewportView(panel);
    panel.setLayout(null);

    btnNewButton.setBounds(27, 98, 89, 23);
    panel.add(btnNewButton);

    btnNewButton_1.setBounds(213, 137, 89, 23);
    panel.add(btnNewButton_1);
    initListener();
}

private void initListener()
{
    btnNewButton.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent me) {
                super.mouseDragged(me);
                Point pos = panel.getMousePosition();
                System.out.println(pos);
                if(panel.getWidth()-pos.x<50 && panel.getHeight()-pos.y<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()+50));
                }
                else if(panel.getHeight()-pos.y<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth(),panel.getHeight()+50));
                }                   
                else if(panel.getWidth()-pos.x<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()));
                }
                btnNewButton.setLocation(pos);
                repaint();
                validate();
            }
        });
    btnNewButton_1.addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent me) {
            super.mouseDragged(me);
            Point pos = panel.getMousePosition();
            if(panel.getWidth()-pos.x<50 && panel.getHeight()-pos.y<50)
            {
                panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()+50));
            }
            else if(panel.getHeight()-pos.y<50)
            {
                panel.setPreferredSize(new Dimension(panel.getWidth(),panel.getHeight()+50));
            }                   
            else if(panel.getWidth()-pos.x<50)
            {
                panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()));
            }
            btnNewButton_1.setLocation(panel.getMousePosition());
            repaint();
            validate();
        }
    });
}

@Override
public void paint(Graphics g)
{
    super.paint(g);
    g.drawLine(btnNewButton.getLocation().x+10,btnNewButton.getLocation().y+32, btnNewButton_1.getLocation().x+10,btnNewButton_1.getLocation().y+32);
}
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.border.EmptyBorder;
导入javax.swing.JScrollPane;
导入javax.swing.JButton;
公共类LineDraw扩展了JFrame{
私有JPanel内容窗格;
JScrollPane scrollPane=新的JScrollPane();
JPanel面板=新的JPanel();
JButton btnNewButton=新JButton(“新按钮”);
JButton btnNewButton_1=新JButton(“新按钮”);
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
LineDraw框架=新建LineDraw();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公共划线(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450300);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
滚动窗格.setBounds(0,0424251);
添加(滚动窗格);
scrollPane.setViewportView(面板);
panel.setLayout(空);
btnNewButton.setBounds(27,98,89,23);
面板。添加(BtnewButton);
btnNewButton_1.立根(213、137、89、23);
面板。添加(btnNewButton_1);
initListener();
}
私有void initListener()
{
addMouseMotionListener(新的MouseAdapter(){
@凌驾
公共无效鼠标标记(MouseEvent me){
超级。鼠标标记(我);
Point pos=panel.getMousePosition();
系统输出打印项次(pos);

如果(panel.getWidth()-pos.x覆盖
panel
paintComponent()
,而不是
JFrame的
paint()

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.*;


public class LineDraw extends JFrame {

    private JPanel contentPane;
    JScrollPane scrollPane = new JScrollPane();
    JPanel panel = new JPanel(){
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawLine(btnNewButton.getLocation().x,btnNewButton.getLocation().y, btnNewButton_1.getLocation().x,btnNewButton_1.getLocation().y);
        }

    };
    JButton btnNewButton = new JButton("New button");
    JButton btnNewButton_1 = new JButton("New button");

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LineDraw frame = new LineDraw();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public LineDraw() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        scrollPane.setBounds(0, 0, 424, 251);
        contentPane.add(scrollPane);

        scrollPane.setViewportView(panel);
        panel.setLayout(null);

        btnNewButton.setBounds(27, 98, 89, 23);
        panel.add(btnNewButton);

        btnNewButton_1.setBounds(213, 137, 89, 23);
        panel.add(btnNewButton_1);
        initListener();
    }

    private void initListener()
    {
        btnNewButton.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent me) {
                super.mouseDragged(me);
                Point pos = panel.getMousePosition();
                System.out.println(pos);
                if(panel.getWidth()-pos.x<50 && panel.getHeight()-pos.y<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()+50));
                }
                else if(panel.getHeight()-pos.y<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth(),panel.getHeight()+50));
                }
                else if(panel.getWidth()-pos.x<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()));
                }
                btnNewButton.setLocation(pos);
                validate();
                repaint();
            }
        });
        btnNewButton_1.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent me) {
                super.mouseDragged(me);
                Point pos = panel.getMousePosition();
                if(panel.getWidth()-pos.x<50 && panel.getHeight()-pos.y<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()+50));
                }
                else if(panel.getHeight()-pos.y<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth(),panel.getHeight()+50));
                }
                else if(panel.getWidth()-pos.x<50)
                {
                    panel.setPreferredSize(new Dimension(panel.getWidth()+50,panel.getHeight()));
                }
                btnNewButton_1.setLocation(panel.getMousePosition());
                validate();
                repaint();
            }
        });
    }

}
import javax.swing.*;
导入javax.swing.border.EmptyBorder;
导入java.awt.*;
导入java.awt.event.*;
公共类LineDraw扩展了JFrame{
私有JPanel内容窗格;
JScrollPane scrollPane=新的JScrollPane();
JPanel面板=新的JPanel(){
@凌驾
公共组件(图形g)
{
超级组件(g);
g、 抽绳(btnNewButton.getLocation().x,btnNewButton.getLocation().y,btnNewButton_1.getLocation().x,btnNewButton_1.getLocation().y);
}
};
JButton btnNewButton=新JButton(“新按钮”);
JButton btnNewButton_1=新JButton(“新按钮”);
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
LineDraw框架=新建LineDraw();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公共划线(){