Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2010, 22:10   #1
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию рисование+массив = экзэпшион

Здравствуйте, у меня проблема.
Задание таково - зделать программу, в которой при нажатии будет рисоваться в окошке. Все хорошо, но когда сворачиваешь окошко и потом разворачиваешь - окошко пустое и если увеличить окошко - тоже пропадет рисунок. Я данные сохраняю в массив, чтобы потом возобновить картинку которая была, но получились траблы. Код таков:
Код:
import java.awt.Canvas;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Main
{
	BoardPaint a = new BoardPaint(300,300);
	public static void main(String s[])
	{
		final Canvas c = new BoardPaint();
		final Frame f = new Frame("kjdngj");
		f.addWindowListener(new WindowAdapter()
		{
			public void windowActivated(WindowEvent e)
			{
				System.out.println("Activ");
			}
			public void windowClosing(WindowEvent e)
			{
				System.out.println("Hello123");
				f.dispose();
			}
		});
		f.setSize(300,300);
		f.add(c);
		f.setVisible(true);
	}
}
Код:
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.HashMap;

class BoardPaint extends Canvas{
	public int x, y, lX, lY;

	public int mas[][];
	public BoardPaint(int i, int j)
	{
		mas = new int[i][j];
	}
	public BoardPaint()
	{
		super();
		
		addMouseListener(new MouseAdapter() 
		{
			public void mousePressed(MouseEvent e) 
			{
				mas[lX][lY] = 1;
				lX = e.getX();
                lY = e.getY();
                repaint();
            }
		});

		addMouseMotionListener(new MouseMotionAdapter()
		{
			public void mouseDragged(MouseEvent me)
			{
				x = me.getX();
				y = me.getY();
				repaint();
			}
		});
	}

	public void update(Graphics g)
	{
		System.out.println(lX + " " + lY);
		g.drawLine(lX, lY, x, y);
		lX = x;
		lY = y;
	}
}
где красным отмечена строчка - там экзэпшион происходит при рисовании, т.е. при нажатии клавиши. экзэпшион таков(таковы):
Код:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at BoardPaint$1.mousePressed(BoardPaint.java:25)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
спасибо заранее за помощь.
Olejik вне форума Ответить с цитированием
Старый 10.04.2010, 21:48   #2
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

я понял в чом ошибка - я создал конструктор, в котором инициализируется массив, но в другом то конструкторе я его не вызываю, но я вот не понимаю, как из конструктора BoardPaint() вытащить массив с данными? Или можно ли в конструкторе вычислить как то сворачивание окошка? Ну чтобы потом при разворачивании восстановить рисунок? Вот измененная программа:
Код:
import java.awt.Canvas;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.*;

public class Main
{

	public static void main(String s[])
	{
		final Canvas c = new BoardPaint();
		final Frame f = new Frame("kjdngj");
		f.addWindowListener(new WindowAdapter()
		{
			public void windowActivated(WindowEvent e)
			{
				System.out.println("Activ");
			}
			public void windowClosing(WindowEvent e)
			{
				System.out.println("Hello123");
				for(int i = 0 ; i < 300 ; i++)
				{
					for(int j = 0 ; j < 300 ; j++)
					{
					}
				}
				f.dispose();
			}
		});
		f.setSize(300,300);
		f.add(c);
		f.setVisible(true);
	}
}
Код:
import java.awt.*;
import java.awt.event.*;
public class BoardPaint extends Canvas
{
	public int lastX, lastY;
	public int ex, ey;
	public int m[][] = new int[300][300];

	public BoardPaint() 
	{
		super();
		addMouseListener(new MouseAdapter() 
		{
			public void mousePressed(MouseEvent e) 
			{
				lastX = e.getX();
				lastY = e.getY();
				System.out.println(lastX + " " + lastY);
				m[lastX][lastY] = 1;
			}
		});

		addMouseMotionListener(new MouseMotionAdapter() 
                {
			public void mouseDragged(MouseEvent e) 
			{
				ex=e.getX();
				ey=e.getY();
				m[ey][ex] = 1;
				repaint();
			}
		});
	}

	public void update(Graphics g) 
	{
		g.drawLine(lastX, lastY, ex, ey);
		System.out.println(lastX + " " + lastY);
		lastX=ex;
		lastY=ey;
	}
}
помогите пожалуйста, как передать в класс main массив который находится в классе BoardPaint? можно конечно в классе BoardPaint зделать еще один конструктор, который будет создавать массив, потом его передавать в класс main и там мутить с ним... я запутался...упячка! )
что делать???
Спасибо за помощь.
Olejik вне форума Ответить с цитированием
Старый 11.04.2010, 23:43   #3
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

еще раз здравствуйте, вот долго мутил и получился вот такой код программы:
Код:
import java.awt.*; 
import java.awt.event.*; 
import java.applet.*; 

public class DoubleBuffer extends Applet
{
	int lastX, lastY;
	int mx, my;
	Image buffer = null;
	int w, h;
	public void init()
	{
		Dimension d = getSize(); 
		w = d.width;
		h = d.height;
		buffer = createImage(w, h);
		addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent me) 
			{
				lastX = me.getX();
				lastY = me.getY();
			}
		});
		addMouseMotionListener(new MouseMotionAdapter()
		{
			public void mouseDragged(MouseEvent me)
			{
				mx = me.getX (); 
				my = me.getY () ;
				repaint(); 
			}
		});
	}
	public void paint(Graphics g)
	{
		Graphics screengc = null; 
		screengc = g;
		g = buffer.getGraphics();
		g.setColor(Color.blue);
		g.drawLine(lastX, lastY, mx, my);
		lastX = mx;
		lastY = my;
		screengc.drawImage(buffer, 0, 0, null);
	}
	public void update(Graphics g)
	{ 
		paint(g) ;
	}
}
в эклипсе он у меня запускается, а как это программу запустить через cmd мне непонятно. если можно, подскажите пожалуйста как работать с этим классом через Main.java, вот как в 1 примере, у меня все создается в мэйне, а работа как таковая происходит в BoardPoint, можно ли тут это осуществить?
Спасибо за внимание.
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование Granus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 32 30.06.2009 23:23
рисование TaTT DoGG Общие вопросы .NET 3 14.05.2009 18:36
Рисование Granus Общие вопросы Delphi 2 24.12.2008 07:44
Рисование TriCERATOP Помощь студентам 5 28.11.2008 15:09
Рисование... HunterMan Win Api 10 30.04.2008 23:46