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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение и размещение компонент, GridBagLayout 
:(
    Опции темы
Neox_GeForce
Дата 10.12.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно реализовать перетаскивание мышью Label.
Как это реализовать?

Код

movedLabel.addMouseListener(new MouseAdapter() {
           @Override
           public void mouseMoved(MouseEvent e) {

           }

           @Override
           public void mouseDragged(MouseEvent e) {
              movedLabel.setLocation(e.getX(),e.getY());
               repaint();  
           }

           @Override
           public void mouseClicked(MouseEvent e) {
           }

           @Override
           public void mousePressed(MouseEvent e) {
          mouseX=e.getX();
               mouseY=e.getY();
          xInfo.setText(""+mouseX);
          yInfo.setText(""+mouseY);
           }
       });


Так не катит

Это сообщение отредактировал(а) Neox_GeForce - 10.12.2009, 18:54


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Neox_GeForce
Дата 10.12.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделал так. Но как то странно оно ведет себя. Как устранить багу?
Код

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

/**
 * Created by IntelliJ IDEA.
 * User: Администратор
 * Date: 10.12.2009
 * Time: 15:21:44
 * To change this template use File | Settings | File Templates.
 */
public class Window extends Frame {
    private TextField xInfo, yInfo;


    private Choice colorLabel;

    private GridBagConstraints gbc;

    private Label x, y, movedLabel;
    private int mouseX = -1, mouseY = -1;


    public Window(String s) {
        super(s);
        this.setSize(600, 500);


        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        this.setLayout(null);


        xInfo = new TextField(5);
        yInfo = new TextField(5);
        xInfo.setEnabled(false);
        yInfo.setEnabled(false);
        x = new Label("X coor");
        y = new Label("Y coor");
        movedLabel = new Label("Переміщення напису");


        createChoice();

        x.setBounds(20, 30, 50, 20);
        this.add(x);

        y.setBounds(20, 50, 50, 20);
        this.add(y);

        xInfo.setBounds(70, 30, 70, 20);
        this.add(xInfo);

        yInfo.setBounds(70, 50, 70, 20);
        this.add(yInfo);

        colorLabel.setLocation(150, 30);
        this.add(colorLabel);

        movedLabel.setBounds(180, 100, 170, 30);

        movedLabel.setForeground(Color.red);
        movedLabel.setBackground(Color.gray);
        this.add(movedLabel);


        colorLabel.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {

                int Selection;
                Selection = colorLabel.getSelectedIndex();
                if (Selection == 0) {
                    movedLabel.setForeground(Color.red);
                } else if (Selection == 1) {
                    movedLabel.setForeground(Color.magenta);
                } else if (Selection == 2) {
                    movedLabel.setForeground(Color.blue);
                } else if (Selection == 3) {
                    movedLabel.setForeground(Color.cyan);
                } else if (Selection == 4) {
                    movedLabel.setForeground(Color.green);
                } else if (Selection == 5) {
                    movedLabel.setForeground(Color.yellow);
                } else if (Selection == 6) {
                    movedLabel.setForeground(Color.white);
                } else if (Selection == 7) {
                    movedLabel.setForeground(Color.gray);
                } else if (Selection == 8) {
                    movedLabel.setForeground(Color.black);
                }


            }
        });


        movedLabel.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                xInfo.setText("" + e.getX());
                yInfo.setText("" + e.getY());
                movedLabel.setLocation(e.getX() + mouseX, e.getY() + mouseY);
            }

        });

        this.setVisible(true);

    }

    private void createChoice() {
        colorLabel = new Choice();
        String[] ColorList = new String[9];
        ColorList[0] = "Red";
        ColorList[1] = "Magenta";
        ColorList[2] = "Blue";
        ColorList[3] = "Cyan";
        ColorList[4] = "Green";
        ColorList[5] = "Yellow";
        ColorList[6] = "White";
        ColorList[7] = "Gray";
        ColorList[8] = "Black";

        for (int i = 0; i < ColorList.length; ++i) {
            colorLabel.insert(ColorList[i], i);
        }
    }


}



Это сообщение отредактировал(а) Neox_GeForce - 10.12.2009, 19:55


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
jk1
Дата 12.12.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Проблема в том, что e.getX() и e.getY() возвращают координаты в координатной системе компонента-источника, а setLocation() пользуется координатной системой окна.  Попробуйте изменить код обработчика следующим образом:

Код

 public void mouseDragged(MouseEvent e) {
                xInfo.setText("" + e.getX());
                yInfo.setText("" + e.getY());
                Point oldLocation = movedLabel.getLocation();
                movedLabel.setLocation(e.getX() + (int)oldLocation.getX() , e.getY() + (int)oldLocation.getY());

            }


Тестировалось NetBeans 1.6.7 под WindowsXP


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


Опытный
**


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

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



спс. Я код изменил, переносить коректно,  Но это мигание можно как то забрать? Чтоб плавно двигалось.


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
jk1
Дата 13.12.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



На своей машине мигания не вижу - Sun JVM 1.6_16, WinXP SP3. Можете попробовать активировать двойную буферизацию. Для этого потребуется использовать Swing-компоненты вместо AWT

Код

private JLabel x, y, movedLabel;
...
movedLabel = new JLabel("Переміщення напису");


и при инициализации включить её руками

Код

movedLabel.setDoubleBuffered(true);




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


Опытный
**


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

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



двойная буферизация не решила проблему. Вот посмотрите что у меня творится. В архиве  видео.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  draGLabel.rar 831,71 Kb


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
jk1
Дата 14.12.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот что работает у меня:

Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Window {

    private JTextField yInfo = new JTextField(5);
    private JTextField xInfo = new JTextField(5);
    private JComboBox colorComboBox = new JComboBox();
    private JLabel x, y, movedLabel;
    final JFrame frame = new JFrame();

    public Window(String s) {
        super();
        // конфигурация окна
        frame.setTitle(s);
        frame.setPreferredSize(new Dimension(600, 500));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout());
        // натройка компонентов
        xInfo.setEnabled(false);
        yInfo.setEnabled(false);
        x = new JLabel("X coor");
        y = new JLabel("Y coor");
        movedLabel = new JLabel("Переміщення напису");
        movedLabel.setBounds(180, 100, 170, 30);
        movedLabel.setForeground(Color.red);
        //и добавление их на форму
        JPanel top = new JPanel();
        top.add(x);
        top.add(xInfo);
        top.add(y);
        top.add(yInfo);
        top.add(colorComboBox);        
        frame.getContentPane().add(movedLabel, BorderLayout.CENTER);
        frame.getContentPane().add(top);
        // Массив всевозможных цветов для надписи
        Color[] ColorList = {Color.RED, Color.MAGENTA, Color.CYAN, Color.GREEN,
            Color.YELLOW, Color.WHITE, Color.GRAY, Color.BLACK};
        // настройка выпадающего списка для отображения цветов и замены цвета метки
        colorComboBox.setModel(new DefaultComboBoxModel(ColorList));
        colorComboBox.setRenderer(new DefaultListCellRenderer() {

            @Override
            public Component getListCellRendererComponent(
                    JList list,
                    Object value,
                    int index,
                    boolean isSelected,
                    boolean cellHasFocus) {
                Image img = frame.createImage(100, 20);
                Graphics g = img.getGraphics();
                g.setColor((Color) value);
                g.fillRect(0, 2, 100, 16);
                return new JLabel(new ImageIcon(img));
            }
        });
        colorComboBox.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent e) {
                movedLabel.setForeground((Color) colorComboBox.getSelectedItem());
            }
        });
        // Привязка обработчика событий мыши для перемещения метки
        movedLabel.addMouseMotionListener(new MouseAdapter() {

            @Override
            public void mouseDragged(MouseEvent e) {
                Point oldLocation = movedLabel.getLocation();
                Point newLocation = new Point(
                        e.getX() + (int) oldLocation.getX(),
                        e.getY() + (int) oldLocation.getY());
                xInfo.setText("" + newLocation.getX());
                yInfo.setText("" + newLocation.getY());

                movedLabel.setLocation(newLocation);
            }
        });
        // отображение окна
        frame.pack();
        frame.setVisible(true);
    }
}


Если я правильно понял задачу...


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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