java - 将 jzy3d.canvas 转换为 awt.component

标签 java swing awt components jzy3d

我需要将 jzy3d Canvas 转换为 java.awt.component,我想使用 JCombobox 和按钮在框架中显示图表,但是当我想将 Canvas 转换为组件时,程序被删除。谢谢您的回答。我试过this别帮我。

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
org.jzy3d.plot3d.rendering.canvas.VoidCanvas cannot be cast to 
java.awt.Component
    at cz.bia.Launcher.lambda$setComponents$0(Launcher.java:63)
    at java.awt.Button.processActionEvent(Button.java:409)
    at java.awt.Button.processEvent(Button.java:377)

启动器.java:

package cz.bia;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import cz.bia.model.IFunction;
import cz.bia.Yao.*;

import java.awt.*;

public class Launcher extends JFrame {
    IFunction[] funs = {new FirstYao(), new SecondYao(), new ThirdYao(), new FourthYao(), new FifthYao(), new SixthYao(), new SeventhYao(), new EighthYao(), new NinthYao(), new TenthYao(),
            new EleventhYao(), new TwelfthYao(), new ThirteenthYao(), new FourthteenthYao(), new FifteenthYao(), new SixteenthYao(), new SeventeenthYao(), new EighteenthYao(),
            new NineteenthYao(), new TwentiethYao(), new TwentyFirstYao()};

    String[] funsToMenu = {"1 Yao", "2 Yao", "3 Yao", "4 Yao", "5 Yao", "6 Yao", "7 Yao", "8 Yao", "9 Yao", "10 Yao", "11 Yao", "12 Yao", "13 Yao", "14 Yao NI",
            "15 Yao NI", "16 Yao", "17 Yao", "18 Yao", "19 Yao NI", "20 Yao NI", "21 Yao NI" };


    private JPanel contentPane;;
    JPanel southPanel;
    JPanel leftPanel;
    private ChartModel chart;

    public static void main(String[] args) throws Exception {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Launcher().setVisible(true);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Launcher() throws Exception {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600,600);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 50, 5));
        leftPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,0,0));
        setComponents();
        setContentPane(contentPane);
        setContentPane(southPanel);
        setContentPane(leftPanel);

    }

    private void setComponents() {
        Button drawIt = new Button("Draw it");
        JComboBox functions = new JComboBox(funsToMenu);
        functions.setForeground(Color.gray);
        functions.setFont(new Font("Arial", Font.PLAIN, 14));
        functions.setMaximumRowCount(21);
        leftPanel.add(functions);
        drawIt.setVisible(true);
        chart = new ChartModel(funs[functions.getSelectedIndex()]);
        leftPanel.add(drawIt);
        drawIt.addActionListener( e -> {
            add( (Component) chart.getChart().getCanvas());
        });

    }
}

ChartMode.java:

package cz.bia;

import java.awt.Component;
import cz.bia.model.IFunction;
import org.jzy3d.chart.Chart;
import org.jzy3d.colors.Color;
import org.jzy3d.colors.ColorMapper;
import org.jzy3d.colors.colormaps.ColorMapRainbow;
import org.jzy3d.maths.Range;
import org.jzy3d.plot3d.builder.Builder;
import org.jzy3d.plot3d.builder.Mapper;
import org.jzy3d.plot3d.builder.concrete.OrthonormalGrid;
import org.jzy3d.plot3d.primitives.Shape;
import org.jzy3d.plot3d.rendering.canvas.Quality;
/**
 * Created by Jakub on 11.10.2016.
 */
public class ChartModel extends Component {


    private IFunction function;
    private Chart chart;
    private Mapper mapper;
    public  Shape surface;

    public ChartModel(IFunction function){
        this.function = function;
        init();
    }

    public void init(){
        Range range = new Range(-100,300);
        int steps = 50;

        surface = Builder.buildOrthonormal(new OrthonormalGrid(range, steps, range, steps), this.getMapper(this.function));
        surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface.getBounds().getZmin(), surface.getBounds().getZmax(), new Color(1, 1, 1, .5f)));
        surface.setFaceDisplayed(true);
        surface.setWireframeDisplayed(true);
        surface.setWireframeColor(Color.BLACK);
        this.chart = new Chart(Quality.Advanced, "swing");
        chart.getScene().getGraph().add(surface);
    }

    private Mapper getMapper(IFunction function){
        Mapper mapper = new Mapper() {
            public double f(double x, double y) {
                double [] param = {x,y};
                return function.calculate(param);
            }
        };
        this.mapper = mapper;
        return mapper;
    }

    public Chart getChart() {
        return chart;
    }
    public void setChart(Chart chart) {
        this.chart = chart;
    }

}

最佳答案

这对我有用。简单的解决方案,当我将 jzy3d Canvas 赋予我的 Canvas 并将其放入面板中时。

Chart chart = AWTChartComponentFactory.chart(Quality.Advanced, IChartComponentFactory.Toolkit.swing);   
ChartScene scene = chart.getScene();
AWTCameraMouseController controller = new AWTCameraMouseController(chart);
Component canvas = (Component) chart.getCanvas();
canvas.addMouseListener(controller);
canvas.addMouseMotionListener(controller);
canvas.addMouseWheelListener(controller);
centerPanel.add(canvas, BorderLayout.CENTER);

关于java - 将 jzy3d.canvas 转换为 awt.component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996514/

相关文章:

java - 在 PHP 代码中运行 Java 程序

java - java中如何修改当前的JPanel和JFrame

java - 使用 Struts 2.3.12 和 Spring 3.1.1 运行 Junit4 时出现空指针

java - Spring 如何在运行时获取有关 "Strongly-typed collection"的通用类型信息?

java - 如何使用正确的编码存储和检索 HTML?

java - Java 中的嵌套复选框

java - 如何在匿名内部类中访问容器类的私有(private)类成员?

java - 为什么这段代码运行得这么慢?

java - 设置从 Java awt 窗口启动 .exe 外部应用程序的窗口位置

java - Swing/AWT 双缓冲在 Linux 上非常慢