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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Соединение JPanel 
:(
    Опции темы
Reptor
Дата 19.6.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Даже не знаю если честно  как назвать эту тему но всётаки что то в названии просматривается  smile 

так вот задача вот такая....

есть у меня несколько вот таких вот окон в приложении

Код

public class EditWindow extends JInternalFrame implements InternalFrameListener


и в каждом из этих окон имеется только один компонент  и всё

Код

 panelPreview = new PreviewPanel(openFrameCount);         // class PreviewPanel extends JPanel
 JScrollPane scrollPane = new JScrollPane(panelPreview);
 getContentPane().add(scrollPane);
 this.setBackground(panelsColor);


собственно у меня тут только графика в этих окнах.

у PreviewPanel переопределён метод 

      
Код

   public void paintComponent(Graphics g)     {}


вот и там рисуется к примеру одна линия и всё.


Вот и приставьте что есть таких 3 окна и в каждом к примеру нарисована линия.. и мне теерь надо создать новое окно в которм я соеденю все эти 3 линии в одну... но при этом каждая линия будет независима и при клике например на первую линию я смогу  её перетащить ввверх а те 2 останутся неизменными. Примерно как на рисунках в атаче

Вот проблема собственно в том как сделать их независимыми на рисунке. У меня сейчас как вы видели   PreviewPanel это класс в которм рисуется одна линия и эти все экземпляры у меня хранятся в листах. И каждый мой экземпляр имеет свои координаты конца и начала линии и так же растояние между линиями (это то что красным на рисунке). Тоесть я могу сделать новый JPanel в которм переопределю метод paintComponent(Graphics g) и там в итерации по листам смогу нарисовать такую вот общую линию.. но как мне сделать так что б я мог их перетаскивать? как сделать что б они у меня были независимыми? Я думал может как то cоздать 3 JPanel на одном окне и уже как то ними манипулировать.... отловол например клик на панеле и когда тащу просто с помощью афиных преобразований перетаскиваю картинку.. но тада не понятно как будут эти связи мои рисоватсья... мне надо как то сделать 3 (в данном примере) независимых линии с которыми я мог бы работать.. отталкиваясь уже от того как уже организовано их хранение.

Вроде как всё сказал... может что забыл или что то может остатся непонятным.. 














Это сообщение отредактировал(а) Reptor - 19.6.2008, 16:41

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ex.rar 7,28 Kb
PM MAIL ICQ   Вверх
dorogoyIV
Дата 20.6.2008, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



по моему мнению:
вот у тебя 4 панели.
на трех ты сам рисуешь, на четвертую можно кинуть что нарисовал.
когда рисуешь, надо получить массив точек нарисованных(плюс цвет, размер, ...).
на четвертую панель выводить этот массив
но это получается flash, может быть лучше не заниматься изобретанием велосипеда, а сразу перейти на flash ?  smile 
PM MAIL   Вверх
Старовъръ
Дата 20.6.2008, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно написать свой Listener, Event и при нажатии, там, на левую кнопку мыши, происходило событие, при отлавливании которого, менялись координаты рисунка. 
PM MAIL WWW   Вверх
Reptor
Дата 20.6.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dorogoyIV, не совсем понятно наличие Flasha?

Это сообщение отредактировал(а) Reptor - 20.6.2008, 12:04
PM MAIL ICQ   Вверх
dorogoyIV
Дата 20.6.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Reptor @  20.6.2008,  12:04 Найти цитируемый пост)
 не совсем понятно наличие Flasha?

я хотел сказать, что для работы с графикой есть более удобные вещи(такие как флэш..., и другие есть...)
но если хочется на Java, то тоже можно..., но неудобно

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


Эксперт
***


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

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



ну просто приложения на Java и там не только графика. Там и логика присутствует и файлы и база
PM MAIL ICQ   Вверх
dorogoyIV
Дата 20.6.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну тогда выложи код упрощенный, описание, и что не получается...
PM MAIL   Вверх
Reptor
Дата 20.6.2008, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dorogoyIV,  код упрощенный будет очень сложно выдрать.... а по описанию и картинке что я выше давал что не понятно?
PM MAIL ICQ   Вверх
dorogoyIV
Дата 20.6.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



то, что на картинке - понятно.
по делу: хранить изображение - мне кажется неправильно, надо хранить массив точек нарисованных.
когда ты на четвертой панели перемещаешь линию, этот массив должен получить новые координаты для своих точек. ну и перерисоваться.

так что у тебя конкретно не получается?
PM MAIL   Вверх
Reptor
Дата 21.6.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dorogoyIV,

 
Цитата

 хранить изображение - мне кажется неправильно, надо хранить массив точек нарисованных.


это есть.


Цитата

когда ты на четвертой панели перемещаешь линию, этот массив должен получить новые координаты для своих точек. ну и перерисоваться.


и это тоже понятно.

Проблема в том как мне отловить  какую именно я перетаскиваю линию (какой масив точек менять 1-ый или 2-ой или 3-тий  ну и так далее..) ?

Добавлено через 2 минуты и 14 секунд
у меня ж 4-ый рисунок это как уже одно целое и как на нём определить что я перетаскаваю?
PM MAIL ICQ   Вверх
dorogoyIV
Дата 24.6.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Reptor @  21.6.2008,  10:14 Найти цитируемый пост)
Проблема в том как мне отловить  какую именно я перетаскиваю линию (какой масив точек менять 1-ый или 2-ой или 3-тий  ну и так далее..) ?

ну вот примерно:
(это конечно всего лишь набросок...)
Код

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

public class Main extends JFrame
                  implements ActionListener
{
 MyPanel panel_1 = new MyPanel();
 MyPanel panel_2 = new MyPanel();
 ResultPanel result = new ResultPanel(this);

 public Main()
 {
  setLayout(new FlowLayout());
  add(panel_1);
  add(panel_2);
  add(result);
  JButton clear = new JButton("clear");
  clear.addActionListener(this);
  add(clear);
 }

 public void actionPerformed(ActionEvent e)
 {
  panel_1.points.clear();
  panel_2.points.clear();
  result.repaint();
 }

 public static void main(String [] args)
 {
  JFrame f = new Main();
  f.setSize(420, 680);
  f.setResizable(false);
  f.setLocationRelativeTo(null);
  f.setVisible(true);
  f.setDefaultCloseOperation(3);
 }
}

class MyPanel extends JPanel
              implements MouseMotionListener
{
 ArrayList <Point> points = new ArrayList <Point> ();
 Point start, end;
 Color color = Color.red;

 MyPanel()
 {
  setBackground(Color.black);
  setPreferredSize(new Dimension(200, 200));
  addMouseMotionListener(this);
 }

 public void paint(Graphics g)
 {
  super.paint(g);
  g.setColor(Color.white);
  g.drawOval(10, getHeight() - 20, 10, 10);
  g.setColor(color);
  g.fillOval(11, getHeight() - 19, 8, 8);
 }

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

 public void mouseDragged(MouseEvent e)
 {
  end = e.getPoint();
  Graphics g = getGraphics();
  g.setColor(Color.white);
  g.drawLine(start.x, start.y, end.x, end.y);
  start = end;
  addPoints(end);
 }

 public void addPoints(Point p)
 {
  points.add(p);
 }
}

class ResultPanel extends JPanel
                  implements MouseMotionListener
{
 Main m;
 MyPanel panel_1, panel_2;
 Point start, end;

 ResultPanel(Main m)
 {
  this.m = m;
  this.panel_1 = m.panel_1;
  this.panel_2 = m.panel_2;
  setBackground(Color.black);
  setPreferredSize(new Dimension(400, 400));  
  addMouseMotionListener(this);
 }

 public void mouseMoved(MouseEvent e)
 {
  start = e.getPoint();
  drawArray(panel_1);
  drawArray(panel_2);
  indicator(panel_1);
  indicator(panel_2);
 }

 public void indicator(MyPanel panel)
 {
  if(panel.points.contains(start))
   panel.color = Color.green;
  else
   panel.color = Color.red;
  panel.repaint();
 }

 public void mouseDragged(MouseEvent e)
 {
  end = e.getPoint();
  draggArray(panel_1);
  draggArray(panel_2);
  start = end;
  repaint();
 }

 public void drawArray(MyPanel panel)
 {
  Graphics g = getGraphics();
  g.setColor(Color.white);

  for(int i = 1; i < panel.points.size(); i++)
  {
   Point p = panel.points.get(i);

//////////////////////////////////////////
// это, что бы рисовалось сплошной линией
//   Point p2 =  panel.points.get(i - 1);
//   g.drawLine(p2.x, p2.y, p.x, p.y);
// следующую строку надо убрать
//////////////////////////////////////////

   g.drawLine(p.x, p.y, p.x, p.y);
  }
 }

 public void draggArray(MyPanel panel)
 {
  Graphics g = getGraphics();
  g.setColor(Color.white);

  if(panel.points.contains(start))
  {
   for(int i = 0; i < panel.points.size(); i++)
   {
    Point p = (Point)panel.points.get(i);
    p = new Point(p.x+= end.x - start.x, p.y+= end.y - start.y);
   }
  }
 }
}

там трудно попадать в точку, поэтому я сделал индикатор - когда попал, горит зеленым. ну если у тебя будут правильные геометрические фигуры, то надо будет массив с координатами точек по другому заполнять
PM MAIL   Вверх
Reptor
Дата 24.6.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dorogoyIV,  если я правильно понял то идея в том что б каждой фигуре назначить какуюто точку а точка может являть собой экземпляр в котором будет и храниться за какую фигуру отвечает эта точка. И таким образом отловил клик на ней и когда тащю меняю координаты нужного мне объекта. Я верно понял??

Добавлено через 8 минут и 42 секунды
Ой что то я натупил

Это сообщение отредактировал(а) Reptor - 24.6.2008, 14:44
PM MAIL ICQ   Вверх
dorogoyIV
Дата 24.6.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Reptor @  24.6.2008,  14:43 Найти цитируемый пост)
Ой что то я натупил

ага, немного  smile 

вот рисуем фигуру (рисуются ведь точки!!!). 
при этом в ArrayList заносим координаты этих точек.
при наведении мышкой получаем координаты мыши, методом contains(...) проверяем - есть ли в ArrayList такая точка.

ну а при перетаскивании фигуры - в методе draggArray(...) изменяем эти координаты этих точек

 smile  ну в общем не могу понятнее объяснить  smile   smile 
PM MAIL   Вверх
Reptor
Дата 24.6.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

ну в общем не могу понятнее объяснить     


не стоит я всё понял и так  smile .  Спасибо. Интересное решение, мне лично очень понравилось.



Это сообщение отредактировал(а) Reptor - 24.6.2008, 15:59
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1254 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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