动态绘制虚线以适应大小调整后的JPanel

问题描述 投票:0回答:1

以下是使用drawLine()在JPanel上绘制水平和垂直虚线的示例。调整JPanel的大小后,虚线也随之调整。

这里是主要对象。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ExampleForPosting  implements Runnable{

    public static void main(String args[]) {
        SwingUtilities.invokeLater(
                new ExampleForPosting ());
    }

    private LineDrawer panel;

    @Override
    public void run() {
        JFrame frame = new JFrame("Line Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new LineDrawer();
        panel.setPreferredSize(new Dimension(300, 200)); 

        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public void setJPanelBackground(Color color) {
        panel.setBackground(color);
        panel.repaint();
    }
}

这是进行绘图的JPanel。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;

import javax.swing.JPanel;


public class LineDrawer extends JPanel 
{
    private Stroke dashedLineStroke = getDashedLineStroke(1);

    @Override
       public void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          g2.setColor(Color.RED);
          g2.setStroke(dashedLineStroke);

          for (int i = 1; i < (this.getWidth()-10) ; i++)
              g.drawLine(10, (i*10), this.getWidth()-10, (i*10));

          for (int i = 1; i < (this.getHeight()-10) ; i++)
              g.drawLine((i*10), 10, (i*10), this.getHeight()-10);
       }

    public Stroke getDashedLineStroke(int width)
    {
        float[] dashPattern = {2, 2};
         return new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 2, dashPattern, 0);
    }
}

大部分情况下。有用。

enter image description here

随着面板尺寸的增加,虚线也随之增加。

enter image description here

问题取决于调整大小时面板在哪里停止,如此处高亮显示的那样,它可能是不完整的,或者边缘没有相等的间距。

enter image description here

目的是使此动态变化,以使虚线始终完整且各边的间距相同。如果需要,可以修改间距,但是即使改变了虚线的属性,间距也应该是动态的。我怀疑计算还需要其他一些属性,但是找不到有效的属性。

java resize drawing draw
1个回答
0
投票
for (int i = 1; i < (this.getWidth()-10) ; i++)

首先,您的循环条件是错误的。如果宽度为300,则将循环290次。您需要将宽度除以10以获得绘制的线数。

以使虚线始终完整且各边的间距相同。

这不可能。如果宽度为105,每个边框为10,则最后一个线段的宽度只能为5。

解决问题的最简单方法是设置绘画的clip bounds。然后,剪切区域之外的任何图形都将被忽略。这将允许在调整框架大小时绘制局部线:

Rectangle clip = new Rectangle(10, 10, getWidth() - 19, getHeight() - 19);
g.setClip( clip );

int linesX = getHeight() / 10;
int linesY = getWidth() / 10;    

for (int i = 1; i < linesX ; i++)
    g.drawLine(10, (i*10), this.getWidth(), (i*10));

for (int i = 1; i < linesY ; i++)
    g.drawLine((i*10), 10, (i*10), this.getHeight()-10);
© www.soinside.com 2019 - 2024. All rights reserved.