[英]Using JComponent to draw unique rectangle
如何在橢圓內繪制唯一的矩形(立方體):
http://i.stack.imgur.com/pmHTl.jpg
對我來說,使用圖形繪制一個矩形(如圖所示)是很棘手的。 關於如何做的任何建議。
好。 我會盡力使自己清晰。 到目前為止,我所擁有的是橙色的橢圓形和后面的細長的灰色橢圓形。 我只需要在一個類中創建這些“點”之一,我將創建許多這些對象。 我需要幫助的任務可能是使用J Component繪制橙色點中的“矩形”形狀。 根據要求,如果此編輯不能滿足您理解我的問題的需要,我將添加一張到目前為止的照片。
謝謝
編輯:如果您對橢圓感興趣,這是創建橢圓的代碼,
public void paint(Graphics g) {
Color c = (Color.orange);
g.setColor(Color.gray);
g.fillOval(3,3,60,60);
g.setColor(c);
g.fillOval(0,0,60,60);
}
編輯:我在SSCCE上的嘗試-> NanoBot類(我在油漆中創建機器人的地方)
/**
* @author (Omar Ahmed)
*/
import javax.swing.*;
import java.awt.*;
public class NanoBot extends Image
{
public NanoBot(int x, int y, int w, int h)
{
super(x,y,w,h);
}
public void paint(Graphics g) {
Color c = (Color.orange);
g.setColor(Color.gray);
g.fillOval(3,3,60,60);
g.setColor(c);
g.fillOval(0,0,60,60);
//g.setColor(Color.black);
//g.fillOval(10,20,10,10);
//g.fillOval(40,20,10,10);
}
}
和驅動程序:
/** Bot Swarm
* Date: May, 2013
* Author: Omar Ahmed
*/
import java.awt.*;
import javax.swing.*;
public class Driver {
private JFrame win;
private NanoBot bot1;
public Driver() {
win = new JFrame(" Swarm ");
win.setLayout(null);
win.setVisible(true);
win.setBounds( 20, 20, 800, 700);
win.getContentPane().setBackground(Color.white);
bot1=new NanoBot(50,50,70,70);
win.add(bot1,0);
}
Hope This Helps
您的第一步是分解您的要求...
您需要繪制3個形狀,正面,頂部,側面。
正面的y位置偏移了總高度的0.412。 它的寬度是總寬度的0.77。
頂部的高度為總高度的0.412,它的水平插圖為總寬度的0.2 ...
側面的x位置偏移了整個寬度的0.77,並且插入了整個寬度的0.47。
這都是非常重要的,因為您要確保形狀可以合理調整大小...
現在,您可以簡單地使用Graphics#drawLine
和Graphics#drawRectangle
來構建形狀,但是對我來說,這是很多工作...
取而代之的是2D圖形功能強大且包含許多奇妙的東西,當今有趣的一種是Shape
API,它允許您定義許多不同的形狀,可以繪制或填充它們。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestChip {
public static void main(String[] args) {
new TestChip();
}
public TestChip() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int width = 44;
int height = 17;
Front front = new Front(width, height);
Top top = new Top(width, height);
Side side = new Side(width, height);
draw(g2d, front, Color.BLACK, Color.YELLOW);
draw(g2d, top, Color.BLACK, Color.GRAY);
draw(g2d, side, Color.BLACK, Color.DARK_GRAY);
g2d.dispose();
}
protected void draw(Graphics2D g2d, Shape shape, Color foreground, Color background) {
g2d.setColor(background);
g2d.fill(shape);
g2d.setColor(foreground);
g2d.draw(shape);
}
}
public class Front extends Path2D.Float {
public Front(float width, float height) {
float frontWidth = width * 0.77f;
float yOffset = height * 0.412f;
moveTo(0, yOffset);
lineTo(frontWidth, yOffset);
lineTo(frontWidth, height);
lineTo(0, height);
closePath();
}
}
public class Side extends Path2D.Float {
public Side(float width, float height) {
float xOffset = width * 0.77f;
float inset = height * 0.47f;
moveTo(xOffset, inset);
lineTo(width, 0);
lineTo(width, inset);
lineTo(xOffset, height);
closePath();
}
}
public class Top extends Path2D.Float {
public Top(float width, float height) {
float inset = width * 0.2f;
float shapeHeight = height * 0.412f;
moveTo(inset, 0);
lineTo(width, 0);
lineTo(width - inset, shapeHeight);
lineTo(0, shapeHeight);
closePath();
}
}
}
您的工作現在是走開,研究示例,研究參考的教程,研究相關的API文檔,並弄清楚如何在圓圈內對齊上述形狀並繪制腿部...
一個提示。 創建一個“ Bug”類,該類知道如何渲染所有這些內容,並根據需要簡單地轉換Graphics
的位置...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.