Java Swing中的抽绳

Java Swing中的抽绳,java,swing,paintcomponent,Java,Swing,Paintcomponent,主要思想是-当滑块的值增大时,更多的线将分割组件的相等部分,并且不与多边形的线相交(就像在图片的左上角)。我想对所有的角落都这样做,但现在我只对其中一个做了 有人能告诉我需要做什么改变才能使我的线条宽度达到1/3吗 我的值适用于1/2,但不适用于1/3,n是滑块的变量 我的代码: import java.awt.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.Chan

主要思想是-当滑块的值增大时,更多的线将分割组件的相等部分,并且不与多边形的线相交(就像在图片的左上角)。我想对所有的角落都这样做,但现在我只对其中一个做了

有人能告诉我需要做什么改变才能使我的线条宽度达到1/3吗

我的值适用于1/2,但不适用于1/3,
n
是滑块的变量

我的代码:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Mariusz extends JFrame {

    private int n = 5;
    private Color kolor = Color.RED;

    MyComponent komponent = null;

    private class MyComponent extends JComponent
    {
        protected void paintComponent (Graphics grafika)
        {
            grafika.setColor(kolor);
            grafika.drawLine(getWidth() * 1/3, 0, 0, getHeight() * 1/3);
            grafika.drawLine(0, getHeight() * 1/3, getWidth() * 1/3, getHeight());
            grafika.drawLine(getWidth() * 1/3, getHeight(),getWidth(), getHeight() * 1/3);
            grafika.drawLine(getWidth(), getHeight() * 1/3, getWidth() * 1/3, 0);

            for (int i = 0; i < n ; i++)
            {
                if (i <= n / 3)
                {
                    grafika.drawLine(getWidth() * i /n, 0, getWidth() * i /n, (getHeight() - getHeight() * 2/3 ) -  getHeight() * i / n); //lewy gorny
                    grafika.drawLine(  getWidth() * i / n,(getHeight() - getHeight() * 2/3 ) +  getHeight() * i / n + getHeight() *1/3, getWidth() * i / n, getHeight() );
                }
                if (i > n / 3)
                {
                    grafika.drawLine(getWidth() * i / n   , 0, getWidth() * i /n,   getHeight() * 2 * i /n / 3   - getHeight() * 1 /3  );
                }
            }
        }
    }

    public Mariusz(String string) 
    {
        super(string);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension d = kit.getScreenSize();
        setBounds( d.width / 4, d.height / 4, d.width / 2, d.height / 2);

        add (komponent = new MyComponent());

        JPanel panel = new JPanel(new BorderLayout());
        add(panel,BorderLayout.SOUTH);

        final JSlider slider = new  JSlider(3,40,n);
        slider.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                // TODO Auto-generated method stub
                n = slider.getValue();
                komponent.repaint();

            }
        });
        panel.add(slider);

        setVisible(true);
    }

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        EventQueue.invokeLater(new  Runnable() {
            public void run() {
                new Mariusz("triangles");
            }
        });

    }
}
import java.awt.*;
导入javax.swing.*;
导入javax.swing.event.ChangeEvent;
导入javax.swing.event.ChangeListener;
公共类Mariusz扩展了JFrame{
私有int n=5;
专用颜色kolor=Color.RED;
MyComponent komponent=null;
私有类MyComponent扩展了JComponent
{
受保护的组件(Graphics grafika)
{
grafika.setColor(kolor);
grafika.drawine(getWidth()*1/3,0,0,getHeight()*1/3);
绘图线(0,getHeight()*1/3,getWidth()*1/3,getHeight());
grafika.drawine(getWidth()*1/3,getHeight(),getWidth(),getHeight()*1/3);
grafika.drawine(getWidth(),getHeight()*1/3,getWidth()*1/3,0);
对于(int i=0;i
你的方法是临时的,我不能相信它会在其他措施(4/5等)中成功

以下是一种基于相似三角形的方法:

从右上角开始向后操作:

h1/h2=(2*w/3)/(2*w/3-(1/n)*(2*w/3))
因此

其中h1=h/3

将其转换为代码

    double f=2./3, f2=1-f;

    g2.setColor(Color.blue);

    for (int i=n-1; i>-1; i--)
    {
      grafika.drawLine(getWidth() * (n-i) / n, 0, getWidth() * (n-i)/n,  
        (int)((getHeight()/ 3)/(f/(f-1.*i/n))) );
    }
对于左上角,我们的工作方式相同,但使用因子f2:

g2.setColor(Color.green);

    for (int i=0; i<n; i++)
    {
        grafika.drawLine(getWidth() * i / n   , 0, getWidth() * i /n,   (int)((getHeight()/ 3)/(f2/(f2-1.*i/n))) );
    }

例如,如果你想要一个4/5的度量值,你必须将f=4/5和所有的2*getHeight()/3改为4*getHeight()/5(getHeight()/3改为getHeight()/5等)。

你的方法是临时的,我不能相信它会在其他度量值(4/5等)中成功

以下是一种基于相似三角形的方法:

从右上角开始向后操作:

h1/h2=(2*w/3)/(2*w/3-(1/n)*(2*w/3))
因此

其中h1=h/3

将其转换为代码

    double f=2./3, f2=1-f;

    g2.setColor(Color.blue);

    for (int i=n-1; i>-1; i--)
    {
      grafika.drawLine(getWidth() * (n-i) / n, 0, getWidth() * (n-i)/n,  
        (int)((getHeight()/ 3)/(f/(f-1.*i/n))) );
    }
对于左上角,我们的工作方式相同,但使用因子f2:

g2.setColor(Color.green);

    for (int i=0; i<n; i++)
    {
        grafika.drawLine(getWidth() * i / n   , 0, getWidth() * i /n,   (int)((getHeight()/ 3)/(f2/(f2-1.*i/n))) );
    }

例如,如果您想要一个4/5的度量值,您必须将f=4./5和所有2*getHeight()/3更改为4*getHeight()/5(getHeight()/3更改为getHeight()/5等)。

让我建议一种不同的方法。与其费劲地从边上画线直到多边形相交,不如画规则的、完整的、垂直的线,然后将多边形覆盖在它们上面

首先,要设置三件事:

protected void paintComponent(Graphics graphics) {

    super.paintComponent(graphics);

    Graphics2D grafika = (Graphics2D) graphics;
  • 始终将调用
    super
    方法作为在
    paintComponent
    中执行的第一件事,以避免出现瑕疵(除非您知道自己在做什么)
  • Graphics
    对象强制转换为
    Graphics2D
    更高级的对象总是安全的
  • 将宽度和高度保存到局部变量,以减少
    paintComponent()
    中的调用次数
  • 现在,使用这个非常简单的循环画线:

    for (int i = 0; i < n; i++)
        grafika.drawLine(w * i / n, 0, w * i / n, h);
    
    最后,设置填充此形状的颜色,绘制它,设置轮廓形状的颜色,然后再次绘制:

    grafika.setColor(getBackground());
    grafika.fill(poly); // draws the inside
    grafika.setColor(kolor);
    grafika.draw(poly); // draws the outline
    

    希望这不会被认为是作弊

    还有这条线

    add(komponent = new MyComponent());
    

    在我看来,这似乎是个麻烦的来源。一定要把它分成两部分。

    让我建议一种不同的方法。与其费劲地从边上画线直到多边形相交,不如画规则的、完整的、垂直的线,然后将多边形覆盖在它们上面

    首先,要设置三件事:

    protected void paintComponent(Graphics graphics) {
    
        super.paintComponent(graphics);
    
        Graphics2D grafika = (Graphics2D) graphics;
    
  • 始终将调用
    super
    方法作为在
    paintComponent
    中执行的第一件事,以避免出现瑕疵(除非您知道自己在做什么)
  • Graphics
    对象强制转换为
    Graphics2D
    更高级的对象总是安全的
  • 将宽度和高度保存到局部变量,以减少
    paintComponent()
    中的调用次数
  • 现在,使用这个非常简单的循环画线:

    for (int i = 0; i < n; i++)
        grafika.drawLine(w * i / n, 0, w * i / n, h);
    
    最后,设置填充此形状的颜色,绘制它,设置轮廓形状的颜色,然后再次绘制:

    grafika.setColor(getBackground());
    grafika.fill(poly); // draws the inside
    grafika.setColor(kolor);
    grafika.draw(poly); // draws the outline
    

    希望这不会被认为是作弊

    还有这条线

    add(komponent = new MyComponent());
    

    在我看来,这似乎是个麻烦的来源。请将其分为两部分。

    要更快地获得更好的帮助,请发布有效的解释,更好地解释什么有效,什么无效,以及您希望它如何工作。两句话还不够。你是在寻找
    setStroke()
    ,还是?@user1803551好的:)主要的想法是-当滑块的值增长时,直线会等分,并且不会与多边形的直线相交(就像在上半部分一样)