gpt4 book ai didi

java - 使用几何形状作为组件

转载 作者:行者123 更新时间:2023-12-03 23:11:57 26 4
gpt4 key购买 nike

我正在尝试创建一个类似于 Paint 的应用程序,我必须在其中使用一些基本形状才能创建更复杂的形状。

我将使用 Swing。我必须能够将对象从一个 JEditorPane 拖放到另一个。我想使用线或圆等基元。

我想知道的是 - 基元必须是组件才能拖放它们吗?如果是这样,我该如何实现?

最佳答案

我实际上计划在这个周末写一篇关于“玩转形状”的博客文章。我有一个从 Shape 创建组件的类。该组件易于使用:

ShapeComponent component = new ShapeComponent(shape, Color.???);

这是代码的早期发布版本:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import javax.swing.JComponent;

/**
* A component that will paint a Shape object. Click detection will be
* determined by the Shape itself, not the bounding Rectangle of the Shape.
*
* Shape objects can be created with an X/Y offset. These offsets will
* be ignored and the Shape will always be painted at (0, 0) so the Shape is
* fully contained within the component.
*
* The foreground color will be used to "fill" the Shape.
*/
public class ShapeComponent extends JComponent
{
private Shape shape;
private boolean antiAliasing = true;

/**
* Create a ShapeComponent that is painted black.
*
* @param shape the Shape to be painted
*/
public ShapeComponent(Shape shape)
{
this(shape, Color.BLACK);
}

/**
* Create a ShapeComponent that is painted filled and outlined.
*
* @param shape the Shape to be painted
* @param color the color of the Shape
*/
public ShapeComponent(Shape shape, Color color)
{
setShape( shape );
setForeground( color );

setOpaque( false );
}

/**
* Get the Shape of the component
*
* @returns the the Shape of the compnent
*/
public Shape getShape()
{
return shape;
}

/**
* Set the Shape for this component
*
* @param shape the Shape of the component
*/
public void setShape(Shape shape)
{
this.shape = shape;
revalidate();
repaint();
}

/**
* Use AntiAliasing when painting the shape
*
* @returns true for AntiAliasing false otherwise
*/
public boolean isAntiAliasing()
{
return antiAliasing;
}

/**
* Set AntiAliasing property for painting the Shape
*
* @param antiAliasing true for AntiAliasing, false otherwise
*/
public void setAntiAliasing(boolean antiAliasing)
{
this.antiAliasing = antiAliasing;
revalidate();
repaint();
}

/**
* {@inheritDoc}
*/
@Override
public Dimension getPreferredSize()
{
// Include Border insets and Shape bounds

Insets insets = getInsets();
Rectangle bounds = shape.getBounds();

// Determine the preferred size

int width = insets.left + insets.right + bounds.width;
int height = insets.top + insets.bottom + bounds.height;

return new Dimension(width, height);
}

/**
* {@inheritDoc}
*/
@Override
public Dimension getMinimumSize()
{
return getPreferredSize();
}

/**
* {@inheritDoc}
*/
@Override
public Dimension getMaximumSize()
{
return getPreferredSize();
}

@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);

// Graphics2D is required for antialiasing and painting Shapes

Graphics2D g2d = (Graphics2D)g.create();

if (isAntiAliasing())
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// Shape translation (ie. non-zero X/Y position in bounding rectangle)
// and Border insets.

Rectangle bounds = shape.getBounds();
Insets insets = getInsets();

// Do all translations at once

g2d.translate(insets.left - bounds.x, insets.top - bounds.y);

// Fill the Shape

g2d.fill( shape );

g2d.dispose();
}

/**
* Determine if the point is in the bounds of the Shape
*
* {@inheritDoc}
*/
@Override
public boolean contains(int x, int y)
{
Rectangle bounds = shape.getBounds();
Insets insets = getInsets();

// Check to see if the Shape contains the point. Take into account
// the Shape X/Y coordinates, Border insets and Shape translation.

int translateX = x + bounds.x - insets.left;
int translateY = y + bounds.y - insets.top;

return shape.contains(translateX, translateY);
}
}

它将帮助您解决问题的组成部分。

编辑:

最新版本和完整的博客条目可以在 Playing With Shapes 找到.

关于java - 使用几何形状作为组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com