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

Dynamically draw dashed line to fit resized JPanel

以下是使用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);
    }
}

大部分时间。有用。

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

问题取决于面板在调整大小时停止的位置,它可能不完整,如此处高亮所示,或者边缘的 space 数量不等。

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

for (int i = 1; i < (this.getWidth()-10) ; i++)

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

so that the dashed lines always complete and same spacing on all sides.

那是不可能的。如果宽度是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);