以下是使用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);
}
}
大部分情况下。有用。
随着面板尺寸的增加,虚线也随之增加。
问题取决于调整大小时面板在哪里停止,如此处高亮显示的那样,它可能是不完整的,或者边缘没有相等的间距。
目的是使此动态变化,以使虚线始终完整且各边的间距相同。如果需要,可以修改间距,但是即使改变了虚线的属性,间距也应该是动态的。我怀疑计算还需要其他一些属性,但是找不到有效的属性。
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);