実行時に JTextArea から Java コードを実行/コンパイルするにはどうすればよいですか?
-
22-09-2019 - |
質問
BufferedImage でペイントされ、JFrame の JDesktopPane に含まれる JInternalFrame があります。また、現在の JInternalFrame の描画された BufferedImage を入力として受け取る Java コード (関数) を記述したい JTextArea もあり、この入力に対して何らかの操作を行った後、新しい操作された Image で JInternalFrame を再度描画する別の操作された BufferedImage を返します。
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 は表示されません。実行する前にこの問題を特定する必要があります。
他のヒント
は、それはなんとかが、些細なことではないのです。
素晴らしい仕事だろう -これは、Groovyのようなスクリプトフレームワークを使用するためにはるかに良いです。 Groovyのは、それはほとんど常に直接Javaコードを実行する、非常にJavaの互換性があります。
(いくつかの奇妙な例外もあります)BeanShellの別のスクリプトフレームワークである。
これらの両方のあなたは、クラスをコンパイルし、既存の実行時にそれをロードする方法を把握しようとの努力なしにしたいだけで何。 (実際、私が見てきた問題は、最初のコンパイルではありませんあなたが編集後に新しいものと交換することができますので、それはあなたのクラスのフラッシュです)。