【问题标题】:How to run/compile Java code from JTextArea at Runtime?如何在运行时从 JTextArea 运行/编译 Java 代码?
【发布时间】:2010-03-24 21:26:16
【问题描述】:

我有一个用 BufferedImage 绘制并包含在 JFrame 的 JDesktopPane 中的 JInternalFrame。我还有一个 JTextArea,我想在其中编写一些 java 代码(函数),将当前 JInternalFrame 绘制的 BufferedImage 作为输入,并在对此输入进行一些操作后返回另一个操作 BufferedImage,该操作再次使用新的操作图像绘制 JInternalFrame。

JTextArea的操作java代码:-

public BufferedImage customOperation(BufferedImage CurrentInputImg) 
{    
    Color colOld;
    Color colNew;

    BufferedImage manipulated=new BufferedImage(CurrentInputImg.getWidth(),CurrentInputImg.getHeight(),BufferedImage.TYPE_INT_ARGB);

    // make all Red pixels of current image black 
    for(int i=0;i< CurrentInputImg.getWidth();i++) {
        for(int j=0;j< CurrentInputImg.getHeight(),j++) { 
            colOld=new Color(CurrentInputImg.getRGB(i,j));
            colNew=new Color(0,colOld.getGreen(),colOld.getBlue(),colOld.getAlpha());
            manipulated.setRGB(i,j,colNew.getRGB());
        } 
    }

    return manipulated;
}

如何在运行时运行/编译这个 JTextArea java 代码并获得一个新的 用于在 JInternalFrame 上绘制的操纵图像?

这是我的主要课程:

(这个类不是实际的,但我已经为您创建了它,用于包含 JTextArea、JInternalFrame、Apply Button 的基本接口)

import java.awt.*;    
import java.awt.event.*;    
import javax.swing.*;    
import javax.swing.event.*;    
import javax.swing.JInternalFrame;    
import javax.swing.JDesktopPane;    
import java.awt.image.*;    
import javax.imageio.*;    
import java.io.*;    
import java.io.File;    
import java.util.*;

class MyCustomOperationSystem extends JFrame    
{

    public JInternalFrame ImageFrame;     
    public BufferedImage CurrenFrameImage;

    public MyCustomOperationSystem() {
        setTitle("My Custom Image Operations");
        setSize((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(), (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight());

        JDesktopPane desktop=new JDesktopPane();
        desktop.setPreferredSize(new Dimension((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(),(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()));

        try {
            CurrenFrameImage=ImageIO.read(new File("c:/Lokesh.png"));
        }catch(Exception exp) {
            System.out.println("Error in Loading Image");
        }

        ImageFrame=new JInternalFrame("Image Frame",true,true,false,true);
        ImageFrame.setMinimumSize(new Dimension(CurrenFrameImage.getWidth()+10,CurrenFrameImage.getHeight()+10));
        ImageFrame.getContentPane().add(CreateImagePanel());
        ImageFrame.setLayer(1);
        ImageFrame.setLocation(100,100);
        ImageFrame.setVisible(true);  
        desktop.setOpaque(true);
        desktop.setBackground(Color.darkGray);
        desktop.add(ImageFrame);
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add("Center",desktop);
        this.getContentPane().add("South",ControlPanel());
        pack();
        setVisible(true);
    }

    public JPanel CreateImagePanel() {
        JPanel tempPanel=new JPanel() {
            public void paintComponent(Graphics g) {
                g.drawImage(CurrenFrameImage,0,0,this);
            }
        };

        tempPanel.setPreferredSize(new Dimension(CurrenFrameImage.getWidth(),CurrenFrameImage.getHeight()));
        return tempPanel;
    }

    public JPanel ControlPanel() {
        JPanel controlPan=new JPanel(new FlowLayout(FlowLayout.LEFT));
        JButton customOP=new JButton("Custom Operation");

        customOP.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evnt) {
                JFrame CodeFrame=new JFrame("Write your Code Here");
                JTextArea codeArea=new JTextArea("Your Java Code Here",100,70);
                JScrollPane codeScrollPan=new JScrollPane(codeArea,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
                CodeFrame.add(codeScrollPan);
                CodeFrame.setVisible(true);
            }
        });

        JButton Apply=new JButton("Apply Code");

        Apply.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){

             // What should I do!!! Here!!!!!!!!!!!!!!!

            }
        });

        controlPan.add(customOP);
        controlPan.add(Apply);
        return controlPan;
    }

    public static void main(String s[]) {
        new MyCustomOperationSystem();
    }
}

注意:在上面的类中 JInternalFrame (ImageFrame) 是不可见的,即使我已经声明它可见。因此,ImageFrame 在编译和运行上述类时是不可见的。您必须在运行之前识别此问题。

【问题讨论】:

  • 你急吗?大概。对我们中的任何人都紧急吗?让我读完今天的网络漫画,然后再回复你。
  • 在标题中加上“紧急”,加上感叹号和糟糕的格式对获得答案没有多大帮助......通过缩进4个空格来格式化代码(选择,按010101按钮或Ctrl+K)。删除所有这些交替的空白行也将提高可读性。结帐:catb.org/esr/faqs/smart-questions.html
  • 重新格式化。我应该根据我这样做的次数获得一个徽章。

标签: java compilation runtime bufferedimage


【解决方案1】:

【讨论】:

    【解决方案2】:

    如果你想在 java 中实际编译代码,这是可行的,但不是微不足道的。

    使用像 Groovy 这样的脚本框架会更好——它会很好用。 Groovy 非常兼容 java,它几乎总是会直接运行 java 代码(有一些奇怪的例外)

    BeanShell 是另一个脚本框架。

    这些都只是你想要的,而不是试图弄清楚如何编译一个类,然后将它加载到你现有的运行时。 (实际上,我看到的问题不是最初的编译,而是刷新你的类,所以你可以在编辑后用新的替换它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多