- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
遵循previously asked question我现在面临的任务是为公司的软件创建这个复杂的插图:
这是一个包含变化数据的动态图。这 3 行不仅仅是一个示例,实际上可以有 1 行到 32 行之间的任意数字。随着应用程序的运行,它们上面的数字数据也可能不断地动态变化。
我有一位图形设计师可供我使用,但我不确定如何利用她的帮助来完成这项任务。关于我上面链接的上一个问题,我最终使用了 JPanel 网格,我将图形放置在它们上面作为 JLabels。但这个任务是处理圆形和非矩形形状。由于圆的形状是圆形的,我不明白如何在 JPanel 上放置大圆圈,并在不同的相邻 JPanel 上放置这些线条。
有什么想法可以操纵这种图形吗?整个结构应该驻留在 JFrame 或 JPanel 上,但这不是问题。
我愿意为此努力工作并学习新技能。
感谢您的任何评论或见解。
最佳答案
演示代码给你看看是否对你实现软件设计有帮助。我用的是java自带的graphics2D。这是静态 JFrame。但您可以对其进行编程以动态实现此设计。
正如您所看到的,如果删除图片中的所有颜色,那么它的设计是相同的。但您也可以使用灰度来为本示例提供所有颜色效果。我添加了一些随机代码,因此您看到的虚线是随机生成的。这是创建的代码,
package Stakeoverflow.swingFrame;
/**
*
* @author Naimish
*/
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ShapeTest extends JFrame {
private static final long serialVersionUID = 1L;
private int width = 300;
private int height = 300;
private int padding = 50;
private BufferedImage graphicsContext;
private JPanel contentPanel = new JPanel();
private JLabel contextRender;
private Stroke dashedStroke = new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 2f, new float[] {3f, 3f}, 0f);
private Stroke solidStroke = new BasicStroke(3.0f);
private RenderingHints antialiasing;
private Random random = new Random();
public static void main(String[] args) {
//you should always use the SwingUtilities.invodeLater() method
//to perform actions on swing elements to make certain everything
//is happening on the correct swing thread
Runnable swingStarter = new Runnable()
{
@Override
public void run(){
new ShapeTest();
}
};
SwingUtilities.invokeLater(swingStarter);
}
public ShapeTest(){
antialiasing = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphicsContext = new BufferedImage(width + (2 * padding), width + (2 * padding), BufferedImage.TYPE_INT_RGB);
contextRender = new JLabel(new ImageIcon(graphicsContext));
contentPanel.add(contextRender);
contentPanel.setSize(width + padding * 2, height + padding * 2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setContentPane(contentPanel);
//take advantage of auto-sizing the window based on the size of its contents
this.pack();
this.setLocationRelativeTo(null);
this.paint();
setVisible(true);
}
public void paint() {
Graphics2D g2d = graphicsContext.createGraphics();
g2d.setRenderingHints(antialiasing);
//Set up the font to print on the circles
Font font = g2d.getFont();
font = font.deriveFont(Font.BOLD, 14f);
g2d.setFont(font);
//clear the background
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, graphicsContext.getWidth(), graphicsContext.getHeight());
//set up the large circle
Point2D largeCircleCenter = new Point2D.Double((double)width / 2 + padding, (double)height / 5 + padding);
double largeCircleRadius = (double)width / 5;
Ellipse2D largeCircle = getCircleByCenter(largeCircleCenter, largeCircleRadius);
//here we build the small circle
Point2D smallCircleCenter = new Point2D.Double();
double smallCircleRadius = 15;
//the resulting end point of the vector is a random distance from the center of the large circle
//in a random direction, and guaranteed to not place the small circle outside the large
smallCircleCenter.setLocation(largeCircleCenter);
Ellipse2D smallCircle = getCircleByCenter(smallCircleCenter, smallCircleRadius);
//before we draw any of the circles or lines, set the clip to the large circle
//to prevent drawing outside our boundaries
// -- g2d.setClip(largeCircle);
//chose a random angle for the line through the center of the small circle
double angle = random.nextDouble() * 360.0d;
//we create two lines that start at the center and go out at the angle in
//opposite directions. We use 2*largeCircleRadius to make certain they
//will be large enough to fill the circle, and the clip we set prevent stray
//marks outside the big circle
Line2D centerLine1 = getVector(smallCircleCenter, angle, largeCircleRadius * 2);
Line2D centerLine2 = getVector(smallCircleCenter, angle, -largeCircleRadius * 2);
Line2D centerLine90 = getVector(smallCircleCenter, 45, 200);
// set line width
g2d.setStroke(new BasicStroke(5));
g2d.setColor(Color.RED);
g2d.draw(centerLine90);
Ellipse2D lineEndCircle = getCircleByCenter(centerLine90.getP2(), smallCircleRadius + 10);
g2d.setStroke(new BasicStroke(2));
g2d.setColor(Color.BLUE);
g2d.draw(lineEndCircle);
// Level 3 Circales
Point2D endCir = centerLine90.getP2();
Line2D centerLine5 = getVector(endCir, 90, smallCircleRadius+30);
g2d.setColor(Color.black);
g2d.draw(centerLine5);
Ellipse2D lineEndCircle2 = getCircleByCenter(centerLine5.getP2(), smallCircleRadius - 5);
g2d.setStroke(new BasicStroke(2));
g2d.setColor(Color.BLUE);
g2d.draw(lineEndCircle2);
g2d.fill(lineEndCircle2);
Line2D centerLine6 = getVector(endCir,0, smallCircleRadius+30);
g2d.setColor(Color.black);
g2d.draw(centerLine6);
Ellipse2D lineEndCircle3 = getCircleByCenter(centerLine6.getP2(), smallCircleRadius - 5);
g2d.setStroke(new BasicStroke(2));
g2d.setColor(Color.BLUE);
g2d.draw(lineEndCircle3);
g2d.fill(lineEndCircle3);
//now we just add 20 and 120 to our angle for the center-line, start at the center
//and again, use largeCircleRadius*2 to make certain the lines are big enough
Line2D sightVector1 = getVector(smallCircleCenter, angle + 60, largeCircleRadius * 2);
Line2D sightVector2 = getVector(smallCircleCenter, angle + 120, largeCircleRadius * 2);
//fill the small circle with blue
g2d.setColor(Color.BLUE);
g2d.fill(smallCircle);
//draw the two center lines lines
g2d.setStroke(dashedStroke);
g2d.draw(centerLine1);
g2d.draw(centerLine2);
//create and draw the black offset vector
Line2D normalVector = getVector(smallCircleCenter, angle + 90, largeCircleRadius * 2);
g2d.setColor(Color.black);
g2d.draw(normalVector);
//draw the offset vectors
g2d.setColor(new Color(0, 200, 0));
g2d.draw(sightVector1);
g2d.draw(sightVector2);
//we save the big circle for last, to cover up any stray marks under the stroke
//of its perimeter. We also set the clip back to null to prevent the large circle
//itselft from accidentally getting clipped
g2d.setClip(null);
g2d.setStroke(solidStroke);
g2d.setColor(Color.BLACK);
g2d.draw(largeCircle);
g2d.dispose();
//force the container for the context to re-paint itself
contextRender.repaint();
}
private static Line2D getVector(Point2D start, double degrees, double length){
//we just multiply the unit vector in the direction we want by the length
//we want to get a vector of correct direction and magnitute
double endX = start.getX() + (length * Math.sin(Math.PI * degrees/ 180.0d));
double endY = start.getY() + (length * Math.cos(Math.PI * degrees/ 180.0d));
Point2D end = new Point2D.Double(endX, endY);
Line2D vector = new Line2D.Double(start, end);
return vector;
}
private static Ellipse2D getCircleByCenter(Point2D center, double radius)
{
Ellipse2D.Double myCircle = new Ellipse2D.Double(center.getX() - radius, center.getY() - radius, 2 * radius, 2 * radius);
return myCircle;
}
}
关于java - 如何在 Java Swing Gui 中创建圆形且复杂的插图元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27646424/
我有一个 png 文件 (1603px x 75px),我想将其用作某个部分的边框。但我希望它出现在内部(插图)而不是外部。但我无法弄清楚如何使边框图像恰好进入(插入)图像高度,而不会使图像的垂直尺寸
UIViewController ContainerView -> UITableViewController界面 View ContainerView -> UIViewController 当显示
我正在努力使我的标题具有漂亮的浮雕外观。它在 Chrome 中运行良好,但 Firefox 退出了。我怎样才能使这种效果在两者中都起作用?这是 fiddle : https://jsfiddle.ne
我有一个包含按钮的 UIBarButtonItem,我在该按钮上为按下/未按下状态设置了自定义背景图像。按下的图像向下移动 4px,因此未按下时的文本看起来垂直居中。我知道我可以使用 [button
uitabbarcontroller子类 隐藏/删除原始选项卡栏 将自定义视图置于uitabbarcontroller视图的底部 uitabbarcontroller->uiviewcontrolle
我试图在一个简单的客户端-服务器程序中说明 Nagle 算法。但我不太明白,也无法将其清楚地打印给我。 在我的示例中,客户端只是生成从 1 到 1024 的整数并将它们发送到服务器。服务器只是将这些
我正在使用 Netbeans GUI,我想在 jTextField 的开头添加 3 个像素的空间: 我已经尝试在 GUI 中使用 setMargin 和 setInset,但它没有改变任何东西。 我还
有没有办法使用 CSS3 在文本输入框上获得插入/内部阴影?下面的插入代码只会做盒子 -moz-box-shadow:inset 0 0 10px #000000; box-shadow:i
我正在对 CSS3 的新功能进行一些测试,但这种组合仅适用于最新版本的 Chrome 和 Firefox,但不适用于 Safari 或 Opera: box-shadow: inset
我想像这样使用 CSS3 获得文本字段效果:- 我尝试使用 CSS3 做到这一点,但未能获得完全相同的外观,请在 jsfiddle.net 中找到我的代码 CSS .field { -webkit-b
我正在使用 knitr::rmarkdown (但 knitr::knitr 和我的 VignetteEngine 一样) .然后我使用 devtools::build_vignettes() 构建我
我有一个具有固定布局边距的 StackView,为所有子元素提供左侧和右侧的边距。这对于大多数子元素(如标签等)非常有用。但是,我还有一个 tableView 作为子元素,它为单元格(例如字幕原型(p
我注意到来自 iPhone 专用应用程序和 Apple Watch 兼容应用程序的推送通知之间存在差异,我希望我的 Watch 兼容应用程序显示与普通 iPhone 专用应用程序推送通知类似的通知。
我正在尝试使用 d3.js 绘制 map ,该 map 具有城市 map 的一部分偏移并绘制在不同的位置( map 插图)。有使用 d3.js 的工作示例吗?如果没有,我是否可以使用不同的 .json
所以,这就是它需要的样子 你在中心看到漂亮的白色效果,我试图重新创建它,但没有成功,这是我的代码: article .txt:after{ position:absolute; c
我在 中添加了一个框阴影并添加了一个 元素到 div。框阴影显示在 div 上,但它不会影响视频元素。 这是预期的行为吗,有没有办法让方框阴影也影响视频? 代码片段: .video-player {
设置: 我正在 Xcode 5 中处理一个显示一组文本字段的 View 。为了在键盘出现时处理滚动,我使用 ScrollView 来放置我的 TextFields。我使用自动布局。 问题: 我正在努力
我有 Auto Complete Mode为 Emacs 安装。 首先:当我输入声明时,我会得到正常的自动完成行为: 所以我点击了 Tab 来完成——没问题。但后来我点击了 ;: 它会立即尝试完成某些
如您所见,我想将搜索栏恰好放在 safeArea 的顶部,但是 proxy.safeAreaInsets 没有正确的值,因为在PreviewProvider 父级使用 edgesIgnoringSaf
将应用沙盒化后,如何使用“从登录时开始”功能制作应用? 最佳答案 谢谢CORY BOHON,他创建了以下教程: http://martiancraft.com/blog/2015/01/login-i
我是一名优秀的程序员,十分优秀!