Hej! Mam problem w prostym programie, który ma być prostym Paintem rysującym figury. Jak na razie udało mi się opracować rysowanie prostokątów lecz problem pojawia się z przekazaniem z Actionlistenera z klasy window informacji do klasy MousePanel o tym jaki rodzaj figury został wybrany. Próbowałem zrobić to jedyną znaną mi metodą poprzez obiekt Window window = new Window(); lecz kompilator nie pozwala na taki zabieg wywalając błędy. Mogę liczyć na jakąś pomoc albo sugestie w jaki sposób mogę to rozwiązać?
Klasa urudzamiająca
import java.awt.EventQueue;
public class Main{
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Window();
}
});
}
}
Klasa tworząca okienko :
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Window extends JFrame implements ActionListener{
JMenuBar menuBar;
JMenu menuFile, menuTools , menuHelp;
JMenuItem mOpen, mSave, mExit;
JMenuItem mInfo;
JMenuItem mCircle, mRactangle, mPolygon;
static int i;
static MousePanel drawArea = new MousePanel();
public Window(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible( true );
setTitle("Paint");
setSize(1300,900);
menuBar = new JMenuBar();
menuFile = new JMenu("File");
mOpen = new JMenuItem("Open");
mSave = new JMenuItem("Save");
mExit = new JMenuItem("Exit");
menuFile.add(mOpen);
menuFile.add(mSave);
menuFile.addSeparator();
menuFile.add(mExit);
menuTools = new JMenu("Tools");
mRactangle = new JMenuItem("Ractangle");
mCircle = new JMenuItem("Circle");
mPolygon = new JMenuItem("Polygon");
menuTools.add(mRactangle);
menuTools.add(mCircle);
menuTools.add(mPolygon);
menuHelp = new JMenu("Help");
mInfo = new JMenuItem("Info");
menuHelp.add(mInfo);
setJMenuBar(menuBar);
menuBar.add(menuFile);
menuBar.add(menuTools);
menuBar.add(menuHelp);
mOpen.addActionListener(this);
mSave.addActionListener(this);
mExit.addActionListener(this);
mRactangle.addActionListener(this);
mCircle.addActionListener(this);
mPolygon.addActionListener(this);
mInfo.addActionListener(this);
MousePanel panel = new MousePanel();
this.add(panel);
}
public int value(){
return i;
}
public void actionPerformed(ActionEvent e){
Object zrodlo = e.getSource();
if(zrodlo==mExit){
System.exit(0);
}
else if(zrodlo==mRactangle){
i=1;
}
else if(zrodlo==mCircle){
i=2;
}
else if(zrodlo==mPolygon){
i=3;
}
}
}
oraz ta odpowiadająca za rysowanie
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.awt.Color;
import javax.swing.JPanel;
public class MousePanel extends JPanel implements MouseListener, MouseMotionListener {
private static final int WIDTH = 1300;
private static final int HEIGHT = 900;
static Window window = new Window();
private final Color BACK_COLOR = Color.WHITE;
Graphics2D g2d;
public int xdragged, ydragged, xpressed, ypressed, xreleased, yreleased;
ArrayList<Point> points = new ArrayList<>();
ArrayList<Point> dimensions = new ArrayList<>();
ArrayList<String> shapes = new ArrayList<>();
public MousePanel() {
setPreferredSize(new Dimension(WIDTH,HEIGHT));
addMouseListener(this);
addMouseMotionListener(this);
}
public void mouseDragged(MouseEvent e) {
System.out.println("mouseDragged");
xdragged = e.getX();
ydragged = e.getY();
repaint();
}
public void mouseMoved(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
System.out.println("mousePressed");
xpressed = e.getX();
ypressed = e.getY();
points.add(new Point(xpressed, ypressed));
}
public void mouseReleased(MouseEvent e) {
xreleased = e.getX();
yreleased= e.getY();
dimensions.add(new Point(xreleased,yreleased));
shapes.add(new String ("prostokat"));
}
protected void paintComponent(Graphics g) {
g2d = (Graphics2D) g;
clear();
drawArrayList(g2d);
if(window.value==1){
g2d.fillRect(Math.min(xpressed,xdragged),Math.min(ypressed,ydragged),Math.abs(xpressed-xdragged),Math.abs(ypressed-ydragged));
}
}
public void clear(){
g2d.setPaint(Color.white);
g2d.fillRect(0, 0, getSize().width, getSize().height);
g2d.setPaint(Color.black);
repaint();
}
private void drawArrayList(Graphics2D g2d)
{
int a, b, c ,d, pom=0;
String figura;
for (Point dim : dimensions) //petla po wymiarze figur-wymiarow figor jest tyle co samych figur...
{
a=(int) points.get(pom).getX();
b=(int) points.get(pom).getY();
c=(int) dim.getX();
d=(int) dim.getY();
figura=shapes.get(pom);
if(figura.equals("prostokat"))
g2d.fillRect(Math.min(a,c),Math.min(b,d),Math.abs(c-a),Math.abs(d-b));
else if(figura.equals("kolo"))
g2d.fillOval(Math.min(a,c),Math.min(b,d),Math.abs(c-a),Math.abs(d-b));
pom++;
}
}
}
Taki błąd pojawia się przy próbie odpalenia skompilowanego programu. W pliku skompilowanym nie pojawia się plik ze skompilowaną klasą MousePanel
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: MousePanel
at Main$1.run(Main.java:10)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.ClassNotFoundException: MousePanel
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 15 more