Toon posts:

[Java] SWT en Canvas3D (J3D)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben aan het kijken of ik een applicatie die ik in Swing geschreven heb kan porten naar SWT. Ik heb nog niet met SWT gewerkt, maar ik heb wat tutorials doorgelopen en het ziet er veelbelovend uit. Maar ik zit met het volgende probleem. Mijn applicatie gebruikt een Canvas3D om af en toe een 3D model te laten zien. Ik heb er bij IBM en Google niets over kunnen vinden, dus volgens mij is het niet mogelijk een dergelijk Canvas3D in een SWT applicatie te gebruiken.

Ik zou eventueel de Canvas3D in een aparte JDialog kunnen laten zien, maar ik was juist van plan om te porten naar SWT omdat het gewoon veel beter uit ziet en beter integreert in het OS, dus om dan nou weer met een dialog aan te komen is ook een beetje onprofessioneel.

Weet iemand hier misschien hoe ik een Canvas3D can gebruiken binnen SWT of er alternatieven bestaan hiervoor? Ik heb wel een experimentele OpenGL component voor SWT gevonden, maar het 3D gedeelte is helemaal in J3D geschreven, dus switchen naar OpenGL is veel te veel werk :)

Alvast bedankt!

Acties:
  • 0 Henk 'm!

Verwijderd

Google eerste hit

Voor zover ik weet is er qua 3d in swt alleen de opengl plugin. Ben bang dat je dus moet kiezen tussen swing en opengl.

Acties:
  • 0 Henk 'm!

Verwijderd

wilde ik ook Google net voor stellen
"Canvas3D swt java" werkt ook :P

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
*zucht*

[rant]

edit:
Laat maar, voel me een beetje onvriendelijk vandaag


[/rant]

Ik heb net bij Eclipse verder gezocht en me daar geregistreerd voor hun forum, dan zoek ik het daar wel uit. Bedankt voor de vriendelijke raad.

[ Voor 44% gewijzigd door Verwijderd op 05-11-2003 12:43 ]


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Die googlelinks zeggen toch niets? Er is één thread die daar genoemd is, die geen oplossing geeft en uit Mei 2002 stamt.
Maar zover ik weet is er nog geen SWT 3DCanvas en zul je het op moeten knappen met OpenGL :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Weer een dag verder, maar goed... HET WERKT!

Hierbij onder CC Attribution-ShareAlike License ;)

edit:
Testcode weggehaald en de code voor een SWTCanvas3D class neergezet die mooi binnen de SWT API past



Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package nl.netforge.swt.components;

/**
 * <p>Title: SWT Test</p>
 * <p>Description: SWT Orientation & testing</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: NetForge.nl</p>
 * @author Rim *** ******
 * @version 1.0
 */


// J3D imports
import javax.media.j3d.Canvas3D;

// awt imports
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.WindowEvent;
import java.awt.GraphicsConfiguration;

// swt imports
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

// magic Sun stuff
import sun.awt.windows.WEmbeddedFrame;


public class SWTCanvas3D extends Canvas3D
{
  public SWTCanvas3D(Composite parent, GraphicsConfiguration gc)
  {
    super(gc);

    Composite container = new Composite(parent, SWT.NONE);
    java.awt.Panel awtPanel = createPanel(container);
    awtPanel.setLayout(new java.awt.GridLayout(1, 1));
    awtPanel.add(this);
  }

  /** This method works the magic. It was already functional in SWT 2.1,
   *  class org.eclipse.swt.internal.awt.SWT_AWT, but for some reason it
   *  was removed from the SWT 3.0 release.
   *
   * @param parent Parent SWT Composite
   * @return a new Panel embedded on the parent composite
   */

  private Panel createPanel(final Composite parent)
  {
    int handle = parent.handle;
    final WEmbeddedFrame frame = new WEmbeddedFrame(handle);
    frame.setLayout(new java.awt.BorderLayout());
    Panel panel = new Panel();
    frame.add(panel, java.awt.BorderLayout.CENTER);
    parent.addListener(SWT.Activate, new Listener()
    {
      public void handleEvent(Event e)
      {
        frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_ACTIVATED));
        frame.dispatchEvent(new FocusEvent(frame, FocusEvent.FOCUS_GAINED));
      }
    });
    parent.addListener(SWT.Deactivate, new Listener()
    {
      public void handleEvent(Event e)
      {
        frame.dispatchEvent(new WindowEvent(frame,
                                            WindowEvent.WINDOW_DEACTIVATED));
        frame.dispatchEvent(new FocusEvent(frame, FocusEvent.FOCUS_LOST));
      }
    });
    parent.addListener(SWT.Resize, new Listener()
    {
      public void handleEvent(Event e)
      {
        Rectangle rect = parent.getClientArea();
        frame.setSize(rect.width, rect.height);
        frame.validate();
      }
    });
    parent.addListener(SWT.Dispose, new Listener()
    {
      public void handleEvent(Event e)
      {
        frame.dispose();
      }
    });
    return panel;
  }

}

[ Voor 24% gewijzigd door Verwijderd op 05-11-2003 16:39 . Reden: Code update ]

Pagina: 1