动态绘制虚线以适应调整大小的 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);
以下是使用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);