首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何绘制多条线,就像分割一个面板Java的扇区一样?

我如何绘制多条线,就像分割一个面板Java的扇区一样?
EN

Stack Overflow用户
提问于 2017-03-02 17:42:41
回答 1查看 992关注 0票数 0

我想知道如何绘制多条线,看上去像将面板划分成扇区。

这是我想画的线条的例子

下面是到目前为止我已经知道的代码,但是它只能在面板上画"x“线和一条水平线。我想知道我如何能够像上面的图像那样画线。

代码语言:javascript
复制
public void paintComponent(Graphics g){
    super.paintComponent(g);

    Graphics2D graphic = (Graphics2D)g;
    Insets insets = getInsets();
    graphic.setStroke(new BasicStroke(5.0f));
    graphic.draw(new Line2D.Double(insets.left, insets.top,getWidth()-insets.right, getHeight()-insets.bottom));
    graphic.draw(new Line2D.Double(insets.left,getHeight()-insets.bottom,getWidth()-insets.right,insets.top));
    graphic.drawLine(0,200,800,200);


}

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-02 19:39:22

也许有几种方法你可以做到这一点,但在我看来,这看起来像辐条在一个车轮,因为我知道如何计算一个点,一个圆,这是我会回到的地方。

我们知道些什么:

  • 我们知道面积(面板的大小)。
  • 我们想要的部分/分部的数量
  • 如何计算圆上的点

因此,有了这些基本信息,我们就可以设计出三角形,它需要在中心点周围均匀地画出除法的数目。

代码语言:javascript
复制
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                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);
        }

        protected Point2D pointAt(double radians, double radius) {
            double x = radius * Math.cos(radians);
            double y = radius * Math.sin(radians);

            return new Point2D.Double(x, y);
        }

        protected Point2D translate(Point2D point, Point2D to) {
            Point2D newPoint = new Point2D.Double(point.getX(), point.getY());
            newPoint.setLocation(point.getX() + to.getX(), point.getY() + to.getY());
            return newPoint;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.BLACK);

            double startAngle = 0;
            double divisions = 12;
            double delta = 360.0 / divisions;

            int centerX = getWidth() / 2;
            int centerY = getHeight() / 2;
            int radius = Math.min(centerX, centerY) * 2; // Overshoot the visible bounds

            Point2D centerPoint = new Point2D.Double(centerX, centerY);
            double angle = startAngle;
            for (int index = 0; index < divisions; index++) {
                Point2D point = pointAt(Math.toRadians(angle), radius);
                point = translate(point, centerPoint);
                g2d.draw(new Line2D.Double(centerPoint, point));
                angle += delta;
            }

            g2d.dispose();
        }

    }

}

现在,如果你不想出现“超调”,那就改变一下。

代码语言:javascript
复制
int radius = Math.min(centerX, centerY) * 2; // Overshoot the visible bounds

代码语言:javascript
复制
int radius = Math.min(centerX, centerY);

现在,如果您想让它看起来更“好看”,您可以考虑添加

代码语言:javascript
复制
RenderingHints hints = new RenderingHints(
        RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(hints);

paintComponent方法中,然后再绘制任何内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42562297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档