Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение полей основного класса, Хочу рисовать в панели осн. класса 
V
    Опции темы
BicUser
Дата 30.8.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.8.2011

Репутация: нет
Всего: нет



Новичок в Java. Первой программой выбрал естественно paint. В моей программе основной класс рисует окно приложения, обрабатывает события от кнопок интерфейса, меню. Также в этом классе создается контейнер класса Panel (да, рисовалка в awt smile ), который хотелось бы изменять из других классов  (множества классов tools, каждый из которых соответствовал бы перу, линии и т.п.).  Может я крайне туп, но монотонное перечитывание разделов книг о наследовании классов и видимости переменных не помогает. Для конкретизации вопроса - простой пример:

Код

import java.awt.event.*;
import java.awt.*;

class VingradQuestion extends Frame{    //основной класс
    Panel p;            //панель для рисования
    VingradQuestion(){        
    p=new Panel();    
    add(p);
    setSize(500,500);
    
    setVisible(true);

    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);}
    });
    new PChanger();            //вызываем вложенный класс изменяющий нашу панель
    }
    
    
    
    
    public static void main(String[] args){
    new VingradQuestion(); 
    }


    class PChanger{                    //тот самый вложенный класс
    public void paint(Graphics g){
    Graphics gr=p.getGraphics();        
    gr.drawLine(0,0,300,300);                      //ожидается появление каких то линий
    gr.drawLine(400,500,500,400);}
    }


    
        
}





Класс вносящий изменения в панель делал и вложенным, и отдельным, и "extends основной", но не клеится.  Пример компилируется без ошибок. Просьба все советы, объяснения и пожелания давать максимально подробно. Если по вашему мнению архитектура неверна изначально - тоже обязательно пишите, попробую всё...  
PM MAIL   Вверх
dorogoyIV
Дата 30.8.2011, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



подправил, надеюсь комментарии не понадобятся? (вроде все понятно  smile )
Код

import java.awt.event.*;
import java.awt.*;

class VingradQuestion extends Frame{    //основной класс
    Panel p;            //панель для рисования
    VingradQuestion(){        
//    p=new Panel();    
    p = new PChanger();
    add(p);
    setSize(500,500);
    
    setVisible(true);

    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);}
    });
 //   new PChanger();            //вызываем вложенный класс изменяющий нашу панель
    }
    
    
    
    
    public static void main(String[] args){
    new VingradQuestion(); 
    }


    class PChanger extends Panel{                    //тот самый вложенный класс
    public void paint(Graphics g){
//    Graphics gr=p.getGraphics();        
   /* gr*/ g.drawLine(0,0,300,300);                      //ожидается появление каких то линий
   /* gr*/ g.drawLine(400,500,500,400);}
    }


    
        
}


Это сообщение отредактировал(а) dorogoyIV - 30.8.2011, 11:12
PM MAIL   Вверх
BicUser
Дата 30.8.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.8.2011

Репутация: нет
Всего: нет



to dorogoyIV

Спасибо за ответ. но в том то и прикол. если подправить таким образом то еще один tool добавить нельзя будет. Представь что класс рисующий в панели p не один. как тогда быть?
PM MAIL   Вверх
dorogoyIV
Дата 30.8.2011, 11:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



пожалуйста - доступ из другого класса (рисуй мышкой)
Код

import java.awt.event.*;
import java.awt.*;

class VingradQuestion extends Frame{    //основной класс
    Panel p;            //панель для рисования
    VingradQuestion(){        
//    p=new Panel();    
    p = new PChanger();
    add(p);
    setSize(500,500);
    
    setVisible(true);

    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);}
    });
//    new PChanger();            //вызываем вложенный класс изменяющий нашу панель



  new Drawing(this);



    }
    
    public static void main(String[] args){
    new VingradQuestion(); 
    }

    class PChanger extends Panel{                    //тот самый вложенный класс
    public void paint(Graphics g){
//    Graphics gr=p.getGraphics();        
   /* gr*/ g.drawLine(0,0,300,300);                      //ожидается появление каких то линий
   /* gr*/ g.drawLine(400,500,500,400);}
    }

 public Panel getPChanger()
 {
  return p;
 }
}

class Drawing implements MouseMotionListener
{
 private VingradQuestion vq;
 private Panel panel;
 private Point start;

 Drawing(VingradQuestion vq)
 {
  this.vq = vq;
  panel = vq.getPChanger(); // получаем экземпляр того вложенного класса
  panel.addMouseMotionListener(this);
 }

 public void mouseMoved(MouseEvent e)
 {
  start = e.getPoint();
 }
 public void mouseDragged(MouseEvent e)
 {
  Point p = e.getPoint();
  Graphics g = panel.getGraphics();
  g.drawLine(start.x, start.y, p.x, p.y);
  start = p;
 }
}

PM MAIL   Вверх
BicUser
Дата 30.8.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.8.2011

Репутация: нет
Всего: нет



Спасибо огромное!! реально уже так пробовал (не методом отдельным правда, а просто отправлял в конструктор эту самую панель, в классе так же переопределял как ты переопределяешь vq) и ничего не получалось. Тогда подумал что строка где "получаем экземпляр" реально делает новый экземпляр, а не создает ссылку на экземпляр панели основного класса. Все работает!!!!!!!!!!!

Код

import java.awt.event.*;
import java.awt.*;
class VingradQuestion extends Frame implements ActionListener
{   
    Panel p, controls; 
    String s;          
    VingradQuestion(){        
    p=new Panel();
    s="nothing";
    add(p, BorderLayout.CENTER);
    controls=new Panel();
    controls.setLayout(new GridLayout(10,1,0,0));
    controls.setBackground(Color.gray);
    Button b1=new Button("Lining");
    Button b2=new Button("Drawing");
    b1.addActionListener(this);
    b2.addActionListener(this);
    controls.add(b1);
    controls.add(b2);
    add(controls, BorderLayout.WEST);            
    setSize(500,500);
       setVisible(true);
    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);}
    });
    new Lining(this);
    new Drawing(this);        
    }
    public void actionPerformed(ActionEvent ev){
    s=ev.getActionCommand();
    }

    public Panel getPanel(){
    return p;    
    }

    public String getString(){
    return s;    
    }    
            
    
    public static void main(String[] args){
    new VingradQuestion(); 
    }

    }



class Drawing implements MouseMotionListener, MouseListener
{
 private Panel panel;
 private Point start;
 private String st;
 private VingradQuestion vq;    
 Drawing(VingradQuestion vq)
 {
  this.vq = vq;
  panel=vq.getPanel();
  panel.addMouseMotionListener(this);
  panel.addMouseListener(this);
 }
 public void mouseMoved(MouseEvent e)
 {
  start = e.getPoint();
 }
 public void mouseDragged(MouseEvent e)
 {st=vq.getString();
  if (st.equals("Drawing")) {
  Point p = e.getPoint();
  Graphics g = panel.getGraphics();
  g.drawLine(start.x, start.y, p.x, p.y);
  start = p;}
 }
 public void mouseClicked(MouseEvent e){}    
 public void mousePressed(MouseEvent e){}
 public void mouseReleased(MouseEvent e){}
 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}    
}




class Lining implements MouseMotionListener, MouseListener
{
 private Panel panel;
 private Point start;
 private VingradQuestion vq;
 private String st;
 Lining(VingradQuestion vq)
 {
  this.vq = vq;
  panel=vq.getPanel();    
  panel.addMouseMotionListener(this);
  panel.addMouseListener(this);
 }
 public void mouseMoved(MouseEvent e){}
 public void mouseDragged(MouseEvent e){}
 public void mouseClicked(MouseEvent e){}    
 public void mousePressed(MouseEvent e){
 start=e.getPoint();}
 public void mouseReleased(MouseEvent e){
 st=vq.getString();
 if (st.equals("Lining")){    
 Graphics g=panel.getGraphics();
 g.drawLine(start.x, start.y, e.getX(), e.getY());}
 }
 public void mouseEntered(MouseEvent e){}
 public void mouseExited(MouseEvent e){}    
 
}

   




Теперь добавлю BufferImage для того чтобы промежуточная линия рисовалась вслед за курсором как во всех граф редакторах и буду думать доп. tools. Спасибо! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.