Program działający jako aplikacja i applet jednocześnie

0

Zastanawia mnie, czy program w java może być jednocześnie appletem i aplikacją? Na razie mam aplikację. Nie wiem czy polecenie zostało dobrze zrozumiane przeze mnie.

Czy ktoś pomógłby przerobić ten kod? Wydaje mi się, że trzeba dodać extends Applet ale co zrobić z extends JFrame?

Mój kod:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.io.File;
import java.io.IOException;
 
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollBar;
 
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
 
public class Pro extends JFrame implements ActionListener, AdjustmentListener{
 
        JMenuItem newItem=new JMenuItem("New"), saveItem=new JMenuItem("Save"), exitItem=new JMenuItem("Exit");
        JMenuItem infoItem=new JMenuItem("O zjawisku"), autorItem=new JMenuItem("O autorach");
        JPanel pright;
        PanelDoRysowania pleft;
        JScrollBar sc1, sc2, sc3, sc4, sc5;
        JLabel e, e1, e2, e3, e4, e5;
   
        JFreeChart w;
        double d=20;
        double a=1;
        double pi=3.14;
        int N=1;
        double L=100;
        double lambda=380;
        double k=0.01745;
        double xx=0, yy=0;
        double s1=0,s2=0,s3=0,M=0; 
        XYSeries series = new XYSeries("XYGraph");
        JLabel lblChart = new JLabel();
        JFileChooser fc;
 
        public Pro() throws HeadlessException {
 
                super();
                setTitle("Dyfrakcja i interferencja");
        setSize(900,600);
        setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        JMenuBar menuBar=new JMenuBar();
        JMenu fileMenu=new JMenu("File"), infoMenu=new JMenu("Info");   
        menuBar.add(fileMenu);
        menuBar.add(infoMenu);
        fileMenu.add(newItem);
        fileMenu.add(saveItem);
        fileMenu.add(exitItem);
        infoMenu.add(infoItem);
        infoMenu.add(autorItem);
        JRootPane root=getRootPane();
        root.setJMenuBar(menuBar);
        setLayout(new BorderLayout());
        pleft=new PanelDoRysowania();
        pright=new JPanel();
        pright=doPanel();
        add(pleft, BorderLayout.WEST);
        add(pright, BorderLayout.EAST);
        pleft.repaint();
                newItem.addActionListener(this);
                saveItem.addActionListener(this);
                exitItem.addActionListener(this);
                infoItem.addActionListener(this);
                autorItem.addActionListener(this);                
 
                setVisible(true);
 
 
        }
 
        public Pro(GraphicsConfiguration arg0) {
                super(arg0);
                // TODO Auto-generated constructor stub
        }
 
        public Pro(String arg0) throws HeadlessException {
                super(arg0);
                // TODO Auto-generated constructor stub
        }
 
        public Pro(String arg0, GraphicsConfiguration arg1) {
                super(arg0, arg1);
                // TODO Auto-generated constructor stub
        }
 
        @Override
        public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                Object source=e.getSource();
                if(source==newItem){
                        sc1.setValue(380);
                        sc2.setValue(20);
                        sc3.setValue(1);
                        sc4.setValue(1);
                        sc5.setValue(100);
                        series.clear();
                        pleft.repaint();
                        pleft.revalidate();
                }
                if(source==saveItem){
                	 // Zapisywanie wykresu do pliku JPG:
                                        
                    fc=new JFileChooser();
            		int retVal=fc.showSaveDialog(this);
            		if(retVal==JFileChooser.APPROVE_OPTION) {
            			File file=fc.getSelectedFile();
            			try {
            				ChartUtilities.saveChartAsJPEG(new File(file.getAbsolutePath()), w, 800, 600);
            				
            			}
            			catch (IOException ex) {
            				JOptionPane.showMessageDialog(this, "Błąd.");
            				System.exit(4);
            			}
            		}
                }
                if(source==exitItem){
                        System.exit(0);
                }
                if(source==infoItem){
                        Okno okno = new Okno();
                        okno.setVisible(true);
                }
                if(source==autorItem){
                        JOptionPane.showMessageDialog(this,"Autorki:\n Katarzyna Mazur\n Magdalena Owerko");
                }
        }

        public JPanel doPanel()
    {
                JPanel panel=new JPanel();
                ImageIcon obrazek = new ImageIcon("tecza.jpg");
                panel.setSize(350,600);
 
                sc1=new JScrollBar(JScrollBar.HORIZONTAL, 380, 10, 380, 770); 
                sc2=new JScrollBar(JScrollBar.HORIZONTAL,20,1,20,41); 
                sc3=new JScrollBar(JScrollBar.HORIZONTAL,1,1,1,11);
                sc4=new JScrollBar(JScrollBar.HORIZONTAL,1,1,1,11); 
                sc5=new JScrollBar(JScrollBar.HORIZONTAL,100,10,100,210);
                sc1.setPreferredSize(new Dimension(300,10));
                sc2.setPreferredSize(new Dimension(300,10));
                sc3.setPreferredSize(new Dimension(300,10));
                sc4.setPreferredSize(new Dimension(300,10));
                sc5.setPreferredSize(new Dimension(300,10));
                sc1.addAdjustmentListener(this);
                sc2.addAdjustmentListener(this);
                sc3.addAdjustmentListener(this);
                sc4.addAdjustmentListener(this);
                sc5.addAdjustmentListener(this);
                e=new JLabel("Opcje:");
                e1=new JLabel("Dlugosc fali: "+sc1.getMinimum()+" [nanometrow]");
                e2=new JLabel("Stala siatki: "+sc2.getMinimum()+" [mikrometrow]");
                e3=new JLabel("Szerokosc szczelin: "+sc3.getMinimum()+" [mikrometrow]");
                e4=new JLabel("Ilosc szczelin: "+sc4.getMinimum());
                e5=new JLabel("Odległosc siatki od ekranu: "+sc5.getMinimum()+" [centymetrow]");
 
                panel.setLayout(new GridLayout(12,1));        
                panel.add(e);
                JLabel etykieta2 = new JLabel();                
                etykieta2.setIcon(obrazek);
                panel.add(etykieta2);
                panel.add(sc1);
                panel.add(e1);
                panel.add(sc2);
                panel.add(e2);
                panel.add(sc3);
                panel.add(e3);
                panel.add(sc4);
                panel.add(e4);
                panel.add(sc5);
                panel.add(e5);        
 
                return panel;
    }
 
 
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Pro a=new Pro();
                
        }
 
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
                // TODO Auto-generated method stub
                int i =e.getValue();
                if(e.getSource()==sc1){
                        e1.setText("Dlugosc fali: "+i+" [nanometrow]");
                        lambda=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                                         }
                if(e.getSource()==sc2){
                        e2.setText("Stala siatki: "+i+" [mikrometrow]");
                        d=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                                }
                if(e.getSource()==sc3){
                        e3.setText("Szerokosc szczelin: "+i+" [mikrometrow]");
                        a=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                }
                if(e.getSource()==sc4){
                        e4.setText("Ilosc szczelin: "+i);
                        N=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                }
                if(e.getSource()==sc5){
                        e5.setText("Odległosc siatki od ekranu: "+i+" [centymetrow]");
                        L=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                }
        }
         
        class PanelDoRysowania extends JPanel 
        {
                public PanelDoRysowania() 
                {}
 
 
                        protected void paintComponent(Graphics g) {
                            super.paintComponent(g);
                            
                            Container cp = getContentPane();
            			   series.clear();
                                        for(int m=-200;m<201;m++){
                                        	if(m==0){
                                        		xx=0;
                                        		int n=m-1;
                                        		int p=m-2;
                                        		double y1, y2;
                                        		s1=Math.sin(k*pi*N*n);
                                                s2=Math.sin(k*pi*a*n/d);
                                                s3=Math.sin(k*pi*n);
                                                M=pi*a*n/d;
                                                y1=s1*s1*s2*s2/(M*M*s3*s3); 
                                                s1=Math.sin(k*pi*N*p);
                                                s2=Math.sin(k*pi*a*p/d);
                                                s3=Math.sin(k*pi*p);
                                                M=pi*a*p/d;
                                                y2=s1*s1*s2*s2/(M*M*s3*s3);
                                                yy=y1+(y1-y2)/3;
                                                series.add(xx, yy);
                                        	}
                                        	else{
                                                xx=m*lambda*L/(100000*d);
                                                s1=Math.sin(k*pi*N*m);
                                                s2=Math.sin(k*pi*a*m/d);
                                                s3=Math.sin(k*pi*m);
                                                M=pi*a*m/d;
                                                yy=s1*s1*s2*s2/(M*M*s3*s3);                                                
                                                series.add(xx, yy); 
                                        	} 
                                        }
 
                                        
                                        XYSeriesCollection dataset = new XYSeriesCollection();
                        				dataset.addSeries(series);
                        				
                        				w=ChartFactory.createXYLineChart(
                        						"", "", "Natezenie", dataset,
                        						PlotOrientation.VERTICAL, false, false, false);
                        			
                      				ChartPanel chartPanel = new ChartPanel(w);
                        				chartPanel.setPreferredSize(new java.awt.Dimension(300, 200));
                        				cp.add(chartPanel);
                        				
                        				
                                    
                        }        
 
        }
        }
0

Znalezione w sieci o apleto-aplikacjach http://liza.umcs.lublin.pl/~abaran/java/2/2.htm#tth_sEc5 ale nie umiem chyba zmienić w mojego programu. Cały czas coś się wykrzacza. Jest błąd, który wydaje mi się nie do pokonania bez całkowitej zmiany programu. Czepia się

JRootPane root=getRootPane();

oraz Container cp = getContentPane();

To był mój pomysł:
```java
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.io.File;
import java.io.IOException;
 
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollBar;
 
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
 
public class Pro extends Applet implements ActionListener, AdjustmentListener{
 
        JMenuItem newItem=new JMenuItem("New"), saveItem=new JMenuItem("Save"), exitItem=new JMenuItem("Exit");
        JMenuItem infoItem=new JMenuItem("O zjawisku"), autorItem=new JMenuItem("O autorach");
        JPanel pright;
        PanelDoRysowania pleft;
        JScrollBar sc1, sc2, sc3, sc4, sc5;
        JLabel e, e1, e2, e3, e4, e5;
   
        JFreeChart w;
        double d=20;
        double a=1;
        double pi=3.14;
        int N=1;
        double L=100;
        double lambda=380;
        double k=0.01745;
        double xx=0, yy=0;
        double s1=0,s2=0,s3=0,M=0; 
        XYSeries series = new XYSeries("XYGraph");
        JLabel lblChart = new JLabel();
        JFileChooser fc;
 
        public void init() {
            resize(900,600);


 
        JMenuBar menuBar=new JMenuBar();
        JMenu fileMenu=new JMenu("File"), infoMenu=new JMenu("Info");   
        menuBar.add(fileMenu);
        menuBar.add(infoMenu);
        fileMenu.add(newItem);
        fileMenu.add(saveItem);
        fileMenu.add(exitItem);
        infoMenu.add(infoItem);
        infoMenu.add(autorItem);
        JRootPane root=getRootPane();
        root.setJMenuBar(menuBar);
        setLayout(new BorderLayout());
        pleft=new PanelDoRysowania();
        pright=new JPanel();
        pright=doPanel();
        add(pleft, BorderLayout.WEST);
        add(pright, BorderLayout.EAST);
        pleft.repaint();
                newItem.addActionListener(this);
                saveItem.addActionListener(this);
                exitItem.addActionListener(this);
                infoItem.addActionListener(this);
                autorItem.addActionListener(this);                
 
                setVisible(true);
 
 
        }
 
        public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                Object source=e.getSource();
                if(source==newItem){
                        sc1.setValue(380);
                        sc2.setValue(20);
                        sc3.setValue(1);
                        sc4.setValue(1);
                        sc5.setValue(100);
                        series.clear();
                        pleft.repaint();
                        pleft.revalidate();
                }
                if(source==saveItem){
                	 // Zapisywanie wykresu do pliku JPG:
                                        
                    fc=new JFileChooser();
            		int retVal=fc.showSaveDialog(this);
            		if(retVal==JFileChooser.APPROVE_OPTION) {
            			File file=fc.getSelectedFile();
            			try {
            				ChartUtilities.saveChartAsJPEG(new File(file.getAbsolutePath()), w, 800, 600);
            				
            			}
            			catch (IOException ex) {
            				JOptionPane.showMessageDialog(this, "Błąd.");
            				System.exit(4);
            			}
            		}
                }
                if(source==exitItem){
                        System.exit(0);
                }
                if(source==infoItem){
                        Okno okno = new Okno();
                        okno.setVisible(true);
                }
                if(source==autorItem){
                        JOptionPane.showMessageDialog(this,"Autorki:\n Katarzyna Mazur\n Magdalena Owerko");
                }
        }

        public JPanel doPanel()
    {
                JPanel panel=new JPanel();
                ImageIcon obrazek = new ImageIcon("tecza.jpg");
                panel.setSize(350,600);
 
                sc1=new JScrollBar(JScrollBar.HORIZONTAL, 380, 10, 380, 770); 
                sc2=new JScrollBar(JScrollBar.HORIZONTAL,20,1,20,41); 
                sc3=new JScrollBar(JScrollBar.HORIZONTAL,1,1,1,11);
                sc4=new JScrollBar(JScrollBar.HORIZONTAL,1,1,1,11); 
                sc5=new JScrollBar(JScrollBar.HORIZONTAL,100,10,100,210);
                sc1.setPreferredSize(new Dimension(300,10));
                sc2.setPreferredSize(new Dimension(300,10));
                sc3.setPreferredSize(new Dimension(300,10));
                sc4.setPreferredSize(new Dimension(300,10));
                sc5.setPreferredSize(new Dimension(300,10));
                sc1.addAdjustmentListener(this);
                sc2.addAdjustmentListener(this);
                sc3.addAdjustmentListener(this);
                sc4.addAdjustmentListener(this);
                sc5.addAdjustmentListener(this);
                e=new JLabel("Opcje:");
                e1=new JLabel("Dlugosc fali: "+sc1.getMinimum()+" [nanometrow]");
                e2=new JLabel("Stala siatki: "+sc2.getMinimum()+" [mikrometrow]");
                e3=new JLabel("Szerokosc szczelin: "+sc3.getMinimum()+" [mikrometrow]");
                e4=new JLabel("Ilosc szczelin: "+sc4.getMinimum());
                e5=new JLabel("Odległosc siatki od ekranu: "+sc5.getMinimum()+" [centymetrow]");
 
                panel.setLayout(new GridLayout(12,1));        
                panel.add(e);
                JLabel etykieta2 = new JLabel();                
                etykieta2.setIcon(obrazek);
                panel.add(etykieta2);
                panel.add(sc1);
                panel.add(e1);
                panel.add(sc2);
                panel.add(e2);
                panel.add(sc3);
                panel.add(e3);
                panel.add(sc4);
                panel.add(e4);
                panel.add(sc5);
                panel.add(e5);        
 
                return panel;
    }
 
 
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Pro h=new Pro();
                h.init();
                
                JFrame f = new JFrame("Dyfrakcja i interferencja");
                f.resize(900, 600);
                
                f.add("Center", h);
                f.show();

        }
 
        @Override
        public void adjustmentValueChanged(AdjustmentEvent e) {
                // TODO Auto-generated method stub
                int i =e.getValue();
                if(e.getSource()==sc1){
                        e1.setText("Dlugosc fali: "+i+" [nanometrow]");
                        lambda=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                                         }
                if(e.getSource()==sc2){
                        e2.setText("Stala siatki: "+i+" [mikrometrow]");
                        d=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                                }
                if(e.getSource()==sc3){
                        e3.setText("Szerokosc szczelin: "+i+" [mikrometrow]");
                        a=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                }
                if(e.getSource()==sc4){
                        e4.setText("Ilosc szczelin: "+i);
                        N=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                }
                if(e.getSource()==sc5){
                        e5.setText("Odległosc siatki od ekranu: "+i+" [centymetrow]");
                        L=i;
                        
                        pleft.repaint();
            pleft.revalidate();
                }
        }
         
        class PanelDoRysowania extends JPanel 
        {
                public PanelDoRysowania() 
                {}
 
 
                        protected void paintComponent(Graphics g) {
                            super.paintComponent(g);
                            
                            Container cp = getContentPane();
            			   series.clear();
                                        for(int m=-200;m<201;m++){
                                        	if(m==0){
                                        		xx=0;
                                        		int n=m-1;
                                        		int p=m-2;
                                        		double y1, y2;
                                        		s1=Math.sin(k*pi*N*n);
                                                s2=Math.sin(k*pi*a*n/d);
                                                s3=Math.sin(k*pi*n);
                                                M=pi*a*n/d;
                                                y1=s1*s1*s2*s2/(M*M*s3*s3); 
                                                s1=Math.sin(k*pi*N*p);
                                                s2=Math.sin(k*pi*a*p/d);
                                                s3=Math.sin(k*pi*p);
                                                M=pi*a*p/d;
                                                y2=s1*s1*s2*s2/(M*M*s3*s3);
                                                yy=y1+(y1-y2)/3;
                                                series.add(xx, yy);
                                        	}
                                        	else{
                                                xx=m*lambda*L/(100000*d);
                                                s1=Math.sin(k*pi*N*m);
                                                s2=Math.sin(k*pi*a*m/d);
                                                s3=Math.sin(k*pi*m);
                                                M=pi*a*m/d;
                                                yy=s1*s1*s2*s2/(M*M*s3*s3);                                                
                                                series.add(xx, yy); 
                                        	} 
                                        }
 
                                        
                                        XYSeriesCollection dataset = new XYSeriesCollection();
                        				dataset.addSeries(series);
                        				
                        				w=ChartFactory.createXYLineChart(
                        						"", "", "Natezenie", dataset,
                        						PlotOrientation.VERTICAL, false, false, false);
                        			
                      				ChartPanel chartPanel = new ChartPanel(w);
                        				chartPanel.setPreferredSize(new java.awt.Dimension(300, 200));
                        				cp.add(chartPanel);
                        				
                        				
                                    
                        }        
 
        }
        }

Jakby co dołączone biblioteki to:
itex-1.3.jar
jcommon-0.9.7.jar
jfreechart-0.9.21.jar

1
  1. Zmieńcie dwa wiersze
import java.applet.applet;
//na
import javax.swing.JApplet;
//oraz
public class Pro extends Applet implements ActionListener, AdjustmentListener{
//na 
public class Pro extends JApplet implements ActionListener, AdjustmentListener{
  1. Poczytajcie o podpisywaniu apletów. Niepodpisany aplet nie utworzy obiektu klasy JFileChooser.
  2. Aplet nie może odczytywać plików z dysku lokalnego, zmieńcie sposób odczytywania
ImageIcon obrazek = new ImageIcon(Pro.class.getResource("tecza.jpg"));
  1. Metoda main jest niedobrze napisana, używa metod, które są obsolete i deprecated. Brakuje też jednej instrukcji.
        public static void main(String[] args) {
                Pro h=new Pro();
                h.init();
 
                JFrame f = new JFrame("Dyfrakcja i interferencja");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                f.setSize(new Dimension(900, 600));
 
                f.add(h,BorderLayout.CENTER);
                f.setVisible(true);
        }
  1. Pomysł by kończyć program gdy nie powiedzie się zapisanie wykresu do pliku jest, delikatnie mówiąc, osobliwy. Prawdę mówiąc, jest głupi i wkurzający użytkownika. Piszecie dokument w Wordzie, program w IDE, ... klikacie przycisk Zapisz, a program wyświetla okienko z napisem "Błąd" i kończy pracę.
  2. Dlaczego nie używacie polskich liter?
0

Dzięki wielkie za pomoc po raz enty bogdans.
A liter polskich nie używam, bo błędy wywala na debianie. To pewnie kwestia ustawień, ale nieważne.

0

Wypada zaznaczyć/zaakceptować odpowiedź, która rozwiązała problem.

1

Rozwiązanie, które stosujesz (tzn. wykonywanie obliczeń w metodzie paintComponent) ma dwie wady:

  • wydajnościowa, obliczenia są wykonywane nie tylko wtedy gdy są konieczne (bo użytkownik przesunął suwak), ale również wtedy gdy są całkowicie niepotrzebne (użytkownik zmienił rozmiar okna),
  • merytoryczna, wykonujesz obliczenia i podmieniasz panel z rysunkiem ale nie odrysowujesz (nie możesz, bowiem wywołanie repaint wytworzyło by nieskończona rekurencję), zatem wykres jest zawsze spóźniony - dotyczy "poprzedniego" położenia suwaków.
    Przemyśl też, czy jeśli uruchamiasz program jako aplet, powinna być w menu możliwość kończenia programu. Zamyka to JVM u użytkownika, nie zamyka strony. Użytkownik nadal widzi stronę, z której zniknął aplet. Aplety przestają tez działać na innych stronach otwartych w tej samej przeglądarce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1