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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение Bounds для JComponent, Почему программа так реагирует? что дела 
:(
    Опции темы
OldJunior
Дата 29.1.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я учусь программировать.
Пытаюсь на форму поместить объекты (от JComponent), что бы их можно было на ней свободно перетаскивать мышкой.
Если бы я просто рисовал прямоугольничек по обновляемым при таскании мышью координатам, то все работает замечательно. Но тогда на форму не получается добавить несколько таких объектов. Если же я каждый раз, кода его надо перерисовать при перетаскивании меняю его границы с помощью setBounds, то он начинает дергаться  и вообще толком не таскается. Почему это происходит. Как сделать это по нормальному?
Вот мой код с плохо перетаскиваемым объектом (он дрожит: рисуется то в одном месте, то в другом (и там и остается после отпускания), если его быстро таскать. И  двигается через раз, если его таскать медленно):
Код

package toshow;

public class Main {

    public static MainJFrame mf;

    public static void main(String[] args) {
        mf = new MainJFrame();
    }
}


Код

package toshow;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JComponent;
import javax.swing.JFrame;

class MainJFrame extends JFrame {

    Ship b1;

    public MainJFrame() {
        super("BattleShips");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(500, 400, 500, 300);
        Container c = this.getContentPane();
        c.setLayout(null);
        b1 = new Ship(20, 20);
        c.add(b1);
        this.setVisible(true);
    }
}

class Ship extends JComponent {

    int x = 0;
    int y = 0;
    int width;
    int height;
    int OffsetX;
    int OffsetY;

    public Ship(int width, int height) {
        super();
        this.width = width;
        this.height = height;
        ML ml = new ML();
        MML mml = new MML();
        this.addMouseListener(ml);
        this.addMouseMotionListener(mml);
        setBounds(new Rectangle(x, y, width + 1, height + 1));
    }

    @Override
    public void paint(Graphics g) {
        Color c = Color.BLACK;
        g.setColor(c);
        g.drawRect(0, 0, width, height);
    }

    class ML extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            OffsetX = e.getX() - x;
            OffsetY = e.getY() - y;
        }
    }

    class MML extends MouseMotionAdapter {

        @Override
        public void mouseDragged(MouseEvent e) {
            x = e.getX() - OffsetX;
            if (x <= 0) {  //Это чтобы он не вылазил за границы
                x = 0;
            }
            if (x + width + 9 >= Main.mf.getWidth()) { //Это чтобы он не вылазил за границы формы
                x = Main.mf.getWidth() - width - 9;
            }
            y = e.getY() - OffsetY;
            if (y <= 0) {
                y = 0;
            }
            if (y + height + 28 >= Main.mf.getHeight()) {
                y = Main.mf.getHeight() - height - 28;
            }
            setBounds(new Rectangle(x, y, width + 1, height + 1));
            repaint();
        }
    }
}


Что делать? Подскажите, пожалуйста.

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


Эксперт
***


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

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





--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
OldJunior
Дата 31.1.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое, очень помогло. Переписал код таким образом и все заработало как надо. 
Код

package toshow;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JComponent;
import javax.swing.JFrame;

class MainJFrame extends JFrame {

    Ship b1;

    public MainJFrame() {
        super("BattleShips");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(500, 400, 500, 300);
        Container c = this.getContentPane();
        c.setLayout(null);
        b1 = new Ship(20, 20);
        c.add(b1);
        this.setVisible(true);
    }
}

class Ship extends JComponent {

    int x = 0;
    int y = 0;
    int width;
    int height;
    int OffsetX;
    int OffsetY;

    public Ship(int width, int height) {
        super();
        this.width = width;
        this.height = height;
        ML ml = new ML();
        MML mml = new MML();
        this.addMouseListener(ml);
        this.addMouseMotionListener(mml);
        setBounds(new Rectangle(x, y, width + 1, height + 1));
    }

    @Override
    public void paint(Graphics g) {
        Color c = Color.BLACK;
        g.setColor(c);
        g.drawRect(0, 0, width, height);
    }

    class ML extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            OffsetX = e.getX();
            OffsetY = e.getY();
        }
    }

    class MML extends MouseMotionAdapter {

        @Override
        public void mouseDragged(MouseEvent e) {
            x = x + e.getX()-OffsetX;
            if (x <= 0) {
                x = 0;
            }
            if (x + width + 9 >= Main.mf.getWidth()) {
                x = Main.mf.getWidth() - width - 9;
            }
            y = y + e.getY()-OffsetY;
            if (y <= 0) {
                y = 0;
            }
            if (y + height + 28 >= Main.mf.getHeight()) {
                y = Main.mf.getHeight() - height - 28;
            }
            setLocation(x, y);
        }
    }
}

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.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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