2010-03-24 253 views
0

我有一個JInternalFrame用BufferedImage繪製,幷包含在JFrame的JDesktopPane中。我還有一個JTextArea,我想在其中編寫一些將當前JInternalFrame的已繪製BufferedImage作爲輸入的java代碼(函數),並在對此輸入執行一些操作之後,返回另一個操作的BufferedImage,再次使用新操縱的圖像繪製JInternalFrame。 JTextArea中的如何在運行時從JTextArea運行/編譯Java代碼?

操縱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的基本接口,應用按鈕)

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不可見。在運行之前,您必須先確定這個問題。

+8

急需嗎?大概。我們中的任何一個人都緊急嗎?讓我完成閱讀我的webcomics的一天,我會盡快回復你。 – Chris 2010-03-24 21:28:29

+4

在標題中加入「urgent」,使用驚歎號和不良格式進行投擲對於獲得答案沒有多大幫助...通過用4個空格縮進來格式化代碼(選擇,按'010101'按鈕或'Ctrl + K')。刪除所有這些交替的空白行也會提高可讀性。結帳:http://catb.org/esr/faqs/smart-questions.html – BalusC 2010-03-24 21:29:20

+0

這功課? – 2010-03-24 21:29:53

回答

0

如果要真正地從Java中編譯代碼,它是可行的,但不是小事。

使用像Groovy這樣的腳本框架要好得多 - 這會很好。 Groovy與Java兼容,它幾乎總是直接運行java代碼(有一些奇怪的例外)

BeanShell是另一種腳本框架。

這些都是做你想要的,而沒有努力想辦法弄清楚如何編譯一個類,然後將其加載到你現有的運行時。 (實際上,我看到的問題不是初始編譯,它是沖洗你的類,以便在編輯後用新的編譯器替換它)。

0

我做了什麼至今: -

  •  //JTextArea = CustomCodeImageText 
         String Code=CustomCodeImageText.getText(); 
    
         Code=Code.replaceAll("\n",""); 
         Code=Code.replaceAll("\t",""); 
    
        File TempOpeartionFile=new File("CustomMethodClass.java"); 
        try{ 
         FileWriter outFile = new FileWriter(TempOpeartionFile); 
    
         PrintWriter out = new PrintWriter(outFile); 
    
    
         out.println("import java.awt.*;"); 
         out.println("import javax.swing.*;"); 
         out.println("import javax.imageio.*;"); 
         out.println("import java.awt.image.*;"); 
         out.println("import java.awt.image.ColorModel;"); 
         out.println("class CustomMethodClass {"); 
         out.println(Code); 
         out.println("}"); 
         out.close(); 
        }catch(IOException e){} 
    
    
         String[] command = new String[4]; 
         command[0] = "cmd"; 
    
         command[1] = "/C"; 
    
         command[2] = "javac "; 
    
         command[3] = "CustomMethodClass.java"; 
    
    
    
         Process process = Runtime.getRuntime().exec(command); 
    
         custom=new CustomMethodClass(); 
         BufferedImage manipulated=custom.customOperation(currentImage); 
    

但是,我m如果您在點擊應用按鈕首次操作的圖片只有一次即。

但在對JTextArea中的代碼進行一些修改後,我得到的是舊的操作圖像,而不是較新的圖像。