Domanda

Ho un JInternalFrame dipinta con un BufferedImage e contenuta nel JDesktopPane di un JFrame. Ho anche una JTextArea dove voglio scrivere del codice Java (funzione) che prende la corrente del JInternalFrame dipinto BufferedImage come ingresso e dopo aver fatto qualche manipolazione su questo ingresso restituisce un'altra BufferedImage manipolato che dipinge il JInternalFrame con la nuova immagine manipolata di nuovo.

codice java Manipolazione di 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;
}

Come posso eseguire / compilare il codice Java JTextArea in fase di esecuzione e ottenere una nuova immagine manipolata per la pittura su JInternalFrame?

Ecco la mia classe principale:

(Questa classe non è un vero e proprio, ma ho creato per voi per interfacciamento base contenente JTextArea, JInternalFrame, Applicare 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();
    }
}

Nota: nella classe sopra JInternalFrame (ImageFrame) non è visibile anche se ho dichiarato visibile. Quindi, ImageFrame non è visibile durante la compilazione e l'esecuzione della classe di cui sopra. È necessario identificare il problema prima di eseguirlo.

È stato utile?

Soluzione

Date un'occhiata alla Java 6 Compiler API

Altri suggerimenti

Se vuoi compilare il codice in realtà dal di dentro Java, è fattibile ma non banale.

E 'molto meglio utilizzare un framework di scripting come Groovy - che avrebbe funzionato grande. Groovy è molto java-compatibili, sarà quasi sempre eseguire codice Java direttamente (ci sono alcune strane eccezioni)

BeanShell è un altro framework di scripting.

Si tratta sia di fare proprio quello che vuoi senza lo sforzo di cercare di capire come compilare una classe quindi caricare nella tua runtime esistente. (In realtà, il problema che ho visto non è la compilazione iniziale, è vampate di calore la classe in modo è possibile sostituirlo con uno nuovo dopo una modifica).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top