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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с перерисовкой 
V
    Опции темы
Матильда
Дата 26.10.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!
Помогите, пожалуйста, решить проблему. Я рисую мышкой на панели, но при этом у меня возникают проблемы с кнопками. Во-первых, кнопки становятся видимыми только после того, как я проведу мышкой над тем местом, где они должны быть. Во-вторых, в процессе рисования мышкой кнопки хаотично перерисовываются. 
Код


   public static void main(String[] args) {        
        DrawFrame myFrame = new DrawFrame(800, 600);
        myFrame.setVisible(true);
    }
class DrawFrame  extends JFrame {    
    public DrawFrame(int x, int y) {
        setSize(x, y);
        setResizable(false); 
        DrawPanel panel = new DrawPanel();
        Container contentPane = getContentPane();
        contentPane.add(panel);
    }
}
class DrawPanel extends JPanel implements ActionListener, MouseListener, MouseMotionListener{ 
    JButton button1, button2, button3;
    int oldX=0, newX=0, oldY=0, newY=0;
    boolean clear=true;    
    public DrawPanel() {
        setLayout(new FlowLayout(FlowLayout.CENTER));
        button1 = new JButton("СОХРАНИТЬ ОТЗЫВ");
        button2 = new JButton("ПРОСМОТРЕТЬ ПРЕДЫДУЩИЙ ОТЗЫВ");
        button3 = new JButton("ОЧИСТИТЬ ЭКРАН");
        add(button1);
        add(button2);
        add(button3);
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);
        addMouseListener(this);
        addMouseMotionListener(this);
    }    
    public void paint(Graphics g) {
        update(g);
    }   
    public void update(Graphics g) {
        g.setClip(0, 40, getWidth(), getHeight()-40);
        g.setColor(Color.BLUE);
        if (clear) {
            g.clearRect(0, 0, getWidth(), getHeight());
            clear = false;
        } else {
            g.drawLine(oldX, oldY, newX, newY);
        }
    }
    …

PM   Вверх
Keyo
Дата 26.10.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возможно вам следует вызвать super.paint(g);

Код

    public void paint(Graphics g) {
        update(g);
        super.paint(g);
    }   

PM MAIL   Вверх
Матильда
Дата 27.10.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовала. Кнопки ведут себя точно так же, как и раньше, а вот мышка рисовать перестала. 
PM   Вверх
Keyo
Дата 27.10.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а если так? 
Код

    public void paintComponent(Graphics g) {
           super.paintComponent(g);        
           update(g);
    }  


или так
Код

    public void paint(Graphics g) {
           super.paint(g);        
           update(g);
    }  



PM MAIL   Вверх
Матильда
Дата 27.10.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В первом случае ни кнопки не появляются, ни рисунок.
Во  втором варианте с кнопками все отлично, а вот мышка не рисует.
PM   Вверх
Keyo
Дата 27.10.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а может скинете весь код? А то я смотрю теоретики не очень спешат помочь, зато на практике могу помочь я smile

Добавлено через 2 минуты и 5 секунд
кстати вообще думаю изначально вам стоило вынести кнопки с этой панели
PM MAIL   Вверх
Матильда
Дата 27.10.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Keyo, спасибо за помощь.
Я попыталась изменить подход. Сделала 2 панели. На первой находятся кнопки, на второй я рисую. Но возникла другая проблема. Нет реакции на нажатие кнопок. 

Код

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {
    
    public Test() {
    }
    
    public static void main(String[] args) {
        DrawFrame myFrame = new DrawFrame(800, 600);
        myFrame.setVisible(true);
    }
}

class DrawFrame  extends JFrame {
    
    JButton button1, button2, button3;
    int oldX=0, newX=0, oldY=0, newY=0;
    boolean clear=true;
    
    public DrawFrame(int x, int y) {
        setSize(x, y);
        setResizable(false);
        setBackground(Color.WHITE);
        DrawPanelButton panel = new DrawPanelButton();
        panel.setSize(800, 40);
        DrawPanelMouse panel2 = new DrawPanelMouse();
        panel2.setSize(800, 600);
        Container contentPane = getContentPane();
        contentPane.add(panel2);
        contentPane.add(panel);
    }
    
    class DrawPanelMouse extends JPanel implements  MouseListener, MouseMotionListener{
        
        public DrawPanelMouse() {
            setBackground(Color.WHITE);
            addMouseListener(this);
            addMouseMotionListener(this);
        }
        
        public void paint(Graphics g) {
            update(g);
        }
        
        public void update(Graphics g) {
            g.setClip(0, 40, getWidth(), getHeight()-40);
            g.setColor(Color.BLUE);
            if (clear) {
                g.clearRect(0, 0, getWidth(), getHeight());
                clear = false;
            } else {
                g.drawLine(oldX, oldY, newX, newY);
            }
        }
        
        public void mouseClicked(MouseEvent e) {
        }
        
        public void mousePressed(MouseEvent e) {
            oldX = e.getX();
            oldY = e.getY();
            newX = e.getX();
            newY = e.getY();
        }
        
        public void mouseReleased(MouseEvent e) {
            oldX=0;
            newX=0;
            oldY=0;
            newY=0;
        }
        
        public void mouseEntered(MouseEvent e) {
        }
        
        public void mouseExited(MouseEvent e) {
        }
        
        public void mouseDragged(MouseEvent e) {
            oldX = newX;
            oldY = newY;
            newX = e.getX();
            newY = e.getY();
            repaint();
        }
        
        public void mouseMoved(MouseEvent e) {
        }
    }
    
    class DrawPanelButton extends JPanel implements  ActionListener {
        
        public DrawPanelButton() {
            setBackground(Color.WHITE);
            setLayout(new FlowLayout(FlowLayout.CENTER));
            button1 = new JButton("СОХРАНИТЬ ОТЗЫВ");
            button2 = new JButton("ПРОСМОТРЕТЬ ПРЕДЫДУЩИЙ ОТЗЫВ");
            button3 = new JButton("ОЧИСТИТЬ ЭКРАН");
            add(button1);
            add(button2);
            add(button3);
            button1.addActionListener(this);
            button2.addActionListener(this);
            button3.addActionListener(this);
        }
        
        public void actionPerformed(ActionEvent event) {
            Object source=event.getSource();
            if (source==button1) {//СОХРАНИТЬ ОТЗЫВ
                
            } else if (source==button2) {//ПРОСМОТРЕТЬ ПРЕДЫДУЩИЙ ОТЗЫВ
                
            } else if (source==button3) {//ОЧИСТИТЬ ЭКРАН
                oldX=0;
                newX=0;
                oldY=0;
                newY=0;
                clear = true;
            }
            repaint();
        }
    }
}

PM   Вверх
Keyo
Дата 28.10.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот, работает. Однако не сказать бы что код идеален... Ну да бросьте в меня камень... ;)

Код

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class Test {
    
    public Test() {
    }
    
    public static void main(String[] args) {
        DrawFrame myFrame = new DrawFrame(800, 600);
        myFrame.setVisible(true);
    }
}
class DrawFrame  extends JFrame {
    
    JButton button1, button2, button3;
    int oldX=0, newX=0, oldY=0, newY=0;
    boolean clear=true;
    DrawPanelMouse drawPanelMouse = new DrawPanelMouse();
    
    public DrawFrame(int x, int y) {
        setSize(x, y);
        setResizable(false);
        setBackground(Color.WHITE);
        DrawPanelButton panel = new DrawPanelButton();
        
        panel.setPreferredSize(new Dimension(800, 40));
        Container contentPane = getContentPane();
        contentPane.add(drawPanelMouse, BorderLayout.CENTER);
        contentPane.add(panel, BorderLayout.NORTH);
    }
    
    class DrawPanelMouse extends JPanel implements  MouseListener, MouseMotionListener{
        
        public DrawPanelMouse() {
            setBackground(Color.WHITE);
            addMouseListener(this);
            addMouseMotionListener(this);
        }
        
        public void paint(Graphics g) {
            update(g);
        }
        
        public void update(Graphics g) {
            g.setClip(0, 0, getWidth(), getHeight());
            g.setColor(Color.BLUE);
            if (clear) {
                g.clearRect(0, 0, getWidth(), getHeight());
                clear = false;
            } else {
                g.drawLine(oldX, oldY, newX, newY);
            }
        }
        
        public void mouseClicked(MouseEvent e) {
        }
        
        public void mousePressed(MouseEvent e) {
            oldX = e.getX();
            oldY = e.getY();
            newX = e.getX();
            newY = e.getY();
        }
        
        public void mouseReleased(MouseEvent e) {
            oldX=0;
            newX=0;
            oldY=0;
            newY=0;
        }
        
        public void mouseEntered(MouseEvent e) {
        }
        
        public void mouseExited(MouseEvent e) {
        }
        
        public void mouseDragged(MouseEvent e) {
            oldX = newX;
            oldY = newY;
            newX = e.getX();
            newY = e.getY();
            repaint();
        }
        
        public void mouseMoved(MouseEvent e) {
        }
    }
    
    class DrawPanelButton extends JPanel implements  ActionListener {
        
        public DrawPanelButton() {
            setBackground(Color.WHITE);
            setLayout(new FlowLayout(FlowLayout.CENTER));
            button1 = new JButton("СОХРАНИТЬ ОТЗЫВ");
            button2 = new JButton("ПРОСМОТРЕТЬ ПРЕДЫДУЩИЙ ОТЗЫВ");
            button3 = new JButton("ОЧИСТИТЬ ЭКРАН");
            add(button1);
            add(button2);
            add(button3);
            button1.addActionListener(this);
            button2.addActionListener(this);
            button3.addActionListener(this);
        }
        
        public void actionPerformed(ActionEvent event) {
            Object source=event.getSource();

            if (source==button1) {//СОХРАНИТЬ ОТЗЫВ
                
            } else if (source==button2) {//ПРОСМОТРЕТЬ ПРЕДЫДУЩИЙ ОТЗЫВ
                
            } else if (source==button3) {//ОЧИСТИТЬ ЭКРАН
                oldX=0;
                newX=0;
                oldY=0;
                newY=0;
                clear = true;
            }
            if(drawPanelMouse != null && drawPanelMouse.isDisplayable())
            drawPanelMouse.repaint();
        }
    }
}

PM MAIL   Вверх
Матильда
Дата 28.10.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Работает. Но лишние кнопки при перерисовке все равно появляются ;)
PM   Вверх
Keyo
Дата 28.10.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Матильда,  smile что за лишние кнопки
PM MAIL   Вверх
Матильда
Дата 28.10.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Когда начинаю рисовать, появляется второй экземпляр кнопок. 
PM   Вверх
Keyo
Дата 28.10.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня нет такого...  smile можно скриншот?
PM MAIL   Вверх
dorogoyIV
Дата 29.10.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



чего то вы там перемудрили  smile 
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Draw extends JFrame
{
 public Draw()
 {
  add(new ButtonsPanel(), "North");
  add(new DrawPanel());
 }

 public static void main(String [] args)
 {
  JFrame f = new Draw();
  f.setBounds(100, 100, 800, 600);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class DrawPanel extends JPanel
                implements MouseMotionListener
{
 Point old;

 DrawPanel()
 {
  addMouseMotionListener(this);
 }

 public void mouseMoved(MouseEvent e)
 {
  old = e.getPoint();
 }

 public void mouseDragged(MouseEvent e)
 {
  Point last = e.getPoint();
  drawLine(old, last);
  old = last;
 }

 private void drawLine(Point old, Point last)
 {
  Graphics g = getGraphics();
  g.setColor(Color.BLUE);
  g.drawLine(old.x, old.y, last.x, last.y);
 }
}

class ButtonsPanel extends JPanel
                   implements ActionListener
{
 JButton save = new JButton("СОХРАНИТЬ ОТЗЫВ");
 JButton look = new JButton("ПРОСМОТРЕТЬ ПРЕДЫДУЩИЙ ОТЗЫВ");
 JButton clear = new JButton("Clear");

 ButtonsPanel()
 {
  add(save);
  add(look);
  add(clear);

  save.addActionListener(new SaveAction());
  clear.addActionListener(this);
 }

 public void actionPerformed(ActionEvent e)
 {
  getParent().repaint();
 }
}

class SaveAction implements ActionListener
{
 public void actionPerformed(ActionEvent e)
 {
  new JFileChooser().showSaveDialog(
            ((JButton)e.getSource()).getParent().getParent());
 }
}

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


Шустрый
*


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

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



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

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

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


 




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


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

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