2012-05-21 3 views
0

У меня есть эта форму кривой, и я хотел, чтобы размер и высота изменялись соответственно относительно размера моего JFrame, например размер моего JFrame установлен в SetSize (440, 300); - а затем, если я максимизирую свой JFrame, я хотел бы, чтобы форма кривой также изменялась, так что форма сохранила бы свою фактическую цифру. Любая помощь, оцените заранее. Спасибо,resize cubcurve on jframe resisize

вот мой код:

float offset = (float) Math.sin(Math.PI); 

x1 = offset; 
y1 = (height/4.0f) - 4.0f; 

x1ctl = ((width/4) - 140) + 90.0f; 
y1ctl = ((height/4) - 100) + 20.0f; 

x2ctl = ((width/4) - 10.0f) + 60.0f; 
y2ctl = ((height/4) - 8.0f) + 1.0f; 

x2 = (width/2.0f) - 20.0f; 
y2 = offset - 4.0f; 

curve = new CubicCurve2D.Float(
     x1,y1, 
     x1ctl,y1ctl, 
     x2ctl,y2ctl, 
     x2,y2); 

g2d.draw(curve); 

ответ

1

Вы можете переопределить paintComponent и использовать размеры компонента. Ниже приведен пример, основанный на аргументы в вопросе:

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.CubicCurve2D; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class CubicCurveComponentTest extends JComponent { 

    public void paintComponent(Graphics g) { 

     float offset = (float) Math.sin(Math.PI); 

     float x1 = offset; 
     float y1 = (getHeight()/4.0f) - 4.0f; 

     float x1ctl = ((getWidth()/4) - 140) + 90.0f; 
     float y1ctl = ((getHeight()/4) - 100) + 20.0f; 

     float x2ctl = ((getWidth()/4) - 10.0f) + 60.0f; 
     float y2ctl = ((getHeight()/4) - 8.0f) + 1.0f; 

     float x2 = (getWidth()/2.0f) - 20.0f; 
     float y2 = offset - 4.0f; 

     CubicCurve2D curve = new CubicCurve2D.Float(
       x1,y1, 
       x1ctl,y1ctl, 
       x2ctl,y2ctl, 
       x2,y2); 

     Graphics2D g2 = (Graphics2D) g; 
     g2.draw(curve); 
    } 

    private static void createAndShowGUI() {  
     JFrame f = new JFrame("Cubic Curve Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(440, 300); 
     f.add(new CubicCurveComponentTest()); 
     f.setVisible(true); 
    } 

    public static void main(String args[]) { 
     Runnable doCreateAndShowGUI = new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }; 
     SwingUtilities.invokeLater(doCreateAndShowGUI); 
    } 
} 

EDIT: координаты пример

Ниже приведен пример координат, полученных из заданных начальных размеров контейнера (440, 300) и магические числа, используемые в исходном расчете:

float x1 = 0; 
    float y1 = getHeight() * 0.24f; 

    float x1ctl = getWidth() * 0.125f; 
    float y1ctl = 0; 

    float x2ctl = getWidth() * 0.24f; 
    float y2ctl = getHeight() * 0.22f; 

    float x2 = getWidth() * 0.45f; 
    float y2 = -getHeight() * 0.013f; 
+0

Благодарим за быстрый ответ. Я ценю это. Да, это переопределение paintComponent, и я уже это сделал. То, что я искал, заключается в том, что при изменении размера вашего JFrame существует ли способ, которым кривая могла бы поддерживать его реальный внешний вид? например, здесь размер кадра равен (440, 300), и если вы попытаетесь максимизировать JFrame, кубирум начинает казаться чем-то вроде прямой, теряющей свою естественную форму кривой. Я пытаюсь найти способ, чтобы точки кривой шли по мере изменения размера рамки? – eLL

+0

@eLL Не уверен, какова логика координат кривой в вашем примере, но кажется, что они связаны с 440 и 300. Должна быть более общая формула, поэтому кривая сохраняет свою форму при изменении размера контейнера. – tenorsax

+0

это именно то, что вы думаете. Я ищу формулу для этих точек кривой, так что если размер рамки Jframe больше или меньше, кубическая куба сохраняет ее форму: знаете ли вы более точный способ достижения этого? float x1ctl = ((getWidth()/4) - 140) + 90.0f; float y1ctl = ((getHeight()/4) - 100) + 20.0f; float x2ctl = ((getWidth()/4) - 10.0f) + 60.0f; float y2ctl = ((getHeight()/4) - 8.0f) + 1.0f; Любая помощь, оценка заранее. – eLL