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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Визуализация графа 
:(
    Опции темы
maxxxover
Дата 3.12.2008, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, посоветуйте средствами какой библиотеки лучше сделать визуализацию графа AWT или Swing? Необходимо чтобы поле было, в котором мы будем создавать граф, ну и пару кнопочек. Джаву знаю не очень(но думаю с С++ перейти будет не очень сложно).

я тут попробовал реализовать некую базу для создания графа, но что-то дело далеко не продвинулось.

Код

import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;

class Circle {
    int X;
    int Y;
    int R;
    Circle(int x, int y, int r){
        X=x;
        Y=y;
        R=r;
    }
    void draw(Graphics g){
        g.setColor(Color.red);
        g.drawOval(X,Y,R,R);
    }
    boolean area(int x, int y){
        if(x<=X+R && x>=X-R && y<=Y+R && y>=Y-R) return true; // данные координаты принадлежат области шара
        return false;
    }
    int getX(){
        return X;
    }
    int getY(){
        return Y;
    }
    int getR(){
        return R;
    }
    void setCor(int x, int y){
        X=x;
        Y=y;
    }
}
public class EventProc extends Applet
   implements MouseMotionListener,MouseListener {
    
   Vector<Circle> circs;
   int width, height;
   Image backbuffer;
   Graphics backg;
   int cur;
   
   public void init() {
      circs=new Vector<Circle>();
      width = getSize().width;
      height = getSize().height;
      backbuffer = createImage( width, height );
      backg = backbuffer.getGraphics();
      backg.setColor( Color.black );
      backg.fillRect( 0, 0, width, height );
      backg.setColor( Color.white );
      addMouseListener(this);    
      addMouseMotionListener(this);
   }
   void Draw() {
      for(int i=0;i<circs.size();i++)
        circs.elementAt(i).draw(backg);
   }
   int FindCirc(int x,int y) {
       for(int i=0;i<circs.size();i++){
        if(circs.elementAt(i).area(x,y)) return i;
       }
       return -1;
   }
   boolean Area(int x,int y){
       for(int i=0;i<circs.size();i++) {
          if(circs.elementAt(i).area(x,y)) return true; // точка с данными коорд принадлежит множеству кружочков
       }
       return false;
   }
   public void mouseMoved( MouseEvent e ) { }
   public void mouseDragged( MouseEvent e ) { }
   public void mouseClicked(MouseEvent e) { }
   public void mouseEntered(MouseEvent e) { }
   public void mouseExited(MouseEvent e) { }
   public void mousePressed(MouseEvent e) {
        if(!Area(e.getX(),e.getY())) {
        circs.addElement(new Circle(e.getX(),e.getY(),15));
        showStatus(""+circs.size());
        }
        cur=FindCirc(e.getX(),e.getY());
        repaint();
        e.consume();
   }
   public void mouseReleased(MouseEvent e) {
        circs.elementAt(cur).setCor(e.getX(),e.getY());
        repaint();
        e.consume();
    }
   public void update(Graphics g) {
      Draw();
      g.drawImage(backbuffer, 0, 0, this);
   }
   public void paint(Graphics g) {
      update(g);
   }
}


 При нажатии клавиши мыши создаётся кружочек, но при перетаскивании этого кружочка у меня возникают проблемы с перерисовкой(кружочек перетаскивается, но на его месте остаётся копия). я думаю это связано с корявым применением двойной буферизации. Буду очень признателен, если вы поможете указать где я накосячил.
PM MAIL   Вверх
AntonSaburov
Дата 3.12.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Swing
PM MAIL WWW ICQ   Вверх
kamre
Дата 4.12.2008, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Новичок



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

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



судя по предаставленным примерам, отличная библиотека. вот только возникает вопрос как её подключить. как я понимаю, нужно скопировать в какую-то из директорий  jdk?
PM MAIL   Вверх
x8m6
Дата 2.2.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Вот если ещё надо -  моя реализация (прикреплен как rar - переименуй  на jar и запускай)... посмотри... если будет что то не понятно объясню

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  VisualGraphEditor.rar 355,22 Kb
PM MAIL   Вверх
velikiyxela
Дата 15.2.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smile  ПОМОГИТЕ!!!! Я УЖЕ ГОТОВ ПОВЕШАТЬСЯ!!!!!

Добавлено через 8 минут и 49 секунд
ПОМОГИТЕ!!!!!!!

package untitled1;

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

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright © 2009</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class Frame1 extends JFrame {
  JPanel contentPane;
  BorderLayout borderLayout1 = new BorderLayout();
  Graphics g;

  //Construct the frame
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  //Component initialization
  private void jbInit() throws Exception  {
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(borderLayout1);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Frame Title");
    g = this.getGraphics();
    g.drawLine(0, 0, 10, 10);                       /*  ЗДЕСЬ NullPointerException   */  }

  //Overridden so we can exit when window is closed
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }
  
  public void paint(Graphics g){
    g.drawLine(0, 0, 10, 10);                       /*  ЗДЕСЬ ВСЁ РАБОТАЕТ.... ПОЧЕМУ?!!! ПОСМОТРИТЕ НА ПЕРВЫЙ ПРИМЕР ТЕМЫ! ТАМ ВСЁ РАОТАЕТ! ПОЧЕМУ?!   */  }
  }
  
}


ОЧЕНЬ ПРОШУ, ПОЖАЛУЙСТА, ПОМОГИТЕ!!! НЕТ УЖЕ НИКАКОГО ТЕРПЕНИЯ!!!!!!!    УМОЛЯЮ!!!!!!!!!!!!!!!!1 ПОМОГИТЕ!!!!!!!!!!!!!!!!!
PM MAIL   Вверх
AntonSaburov
Дата 17.2.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата(velikiyxela @  15.2.2009,  21:19 Найти цитируемый пост)
  private void jbInit() throws Exception  {
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(borderLayout1);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Frame Title");
    g = this.getGraphics();
    g.drawLine(0, 0, 10, 10);                       /*  ЗДЕСЬ NullPointerException   */  }


Читаем

public Graphics getGraphics()
    Creates a graphics context for this component. This method will return null if this component is currently not displayable. 

Так вот JFrame еще не визуализирован по сути своей.

Кроме этого - ЗАЧЕМ рисовать не в методе pain ?
PM MAIL WWW ICQ   Вверх
Proger10
Дата 6.3.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подниму эту тему, покуда у меня очень схожий вопрос с последним сообщением smile

Насколько корректен вот такой код:
Код
JButton btn1 = new JButton( "btn1" );
panel1.add( btn1 );

btn1.addActionListener( new ActionListener() {
        public void actionPerformed( ActionEvent e ){
            Graphics g = panel1.getGraphics();
            g.drawLine( 0, 0, 100, 100 );
        }
    }
);

Просто почему-то я читал на форумах, что через getGraphics вообще крайне нежелательно брать контекст и отрисовывать.. А почему?
Такой метод, проверил - работает. В каких-то случаях может не заработать? (кроме того, что не заработает когда панель будет не видима).

добавлено
Кстати. Касаемо кодов в вышеидущих сообщениях. Насколько мне известно перекрывать для отрисовки лучше метод paintComponent, а не paint, как там и делается..

Это сообщение отредактировал(а) Proger10 - 6.3.2009, 22:09
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.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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