Как запустить / скомпилировать код Java из JTextArea во время выполнения? - PullRequest
0 голосов
/ 25 марта 2010

У меня есть JInternalFrame, нарисованный с помощью BufferedImage и содержащийся в JDesktopPane JFrame. У меня также есть JTextArea, где я хочу написать некоторый Java-код (функцию), который принимает окрашенный BufferedImage текущего JInternalFrame в качестве ввода, и после некоторой манипуляции с этим входом он возвращает другой манипулированный BufferedImage, который снова рисует JInternalFrame с новым обработанным изображением. 1001 *

Манипуляции с Java-кодом JTextArea : -

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;
}

Как я могу запустить / скомпилировать этот Java-код JTextArea во время выполнения и получить новый манипулировал изображением для рисования на 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 не виден при компиляции и запуске вышеупомянутого класса. Вы должны определить эту проблему перед ее запуском.

Ответы [ 2 ]

5 голосов
/ 25 марта 2010

Взгляните на API компилятора Java 6

0 голосов
/ 25 марта 2010

Если вы хотите скомпилировать код из Java, это выполнимо, но не тривиально.

Гораздо лучше использовать среду сценариев, такую ​​как Groovy, - это будет прекрасно работать. Groovy очень совместим с Java, он почти всегда будет запускать Java-код напрямую (есть несколько странных исключений)

BeanShell - еще одна среда сценариев.

Они оба делают то, что вы хотите, не пытаясь понять, как скомпилировать класс, а затем загрузить его в существующую среду выполнения. (На самом деле проблема, с которой я столкнулся, заключается не в начальной компиляции, а в том, что ваш класс очищается, поэтому вы можете заменить его новым после редактирования).

...