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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 2Д графика 
:(
    Опции темы
Reptor
Дата 10.4.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вопрос состоит в следующем : возможно ли рисовать на JFrame или необходим какойто компонент вроде Canvas в Delphi? Может нужна какаято область для рисования и как ее задавать и желательно что б все ето было с прокруткой. Я просто смотрел примеры а там все с помощью апплетов. Что без апплетов никак нельзя?

Добавлено через 5 минут и 22 секунды
Код

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JPanel;
import javax.swing.UIManager;


public class draw_frame implements ActionListener{
    
    static JFrame frame = null;    
    
    Dimension totalSize;
    
    public JComponent createGUI(){
        JButton button;
        GridBagLayout gb = new GridBagLayout();
        JPanel componentsPanel = new JPanel(gb);
        GridBagConstraints gc = new GridBagConstraints();
        componentsPanel.setLayout(gb);
                    
        button = new JButton("Another Window");
        button.addActionListener(this);
        gc.weightx = 1.0;
        gc.weighty = 1.0;
        gc.gridx =0;
        gc.gridy = 0;        
        gc.anchor = GridBagConstraints.NORTHWEST;
        gc.insets = new Insets(10,10,0,0);        
        gb.setConstraints(button, gc);
        componentsPanel.add(button);
    
        return componentsPanel;
    };        

    public void actionPerformed(ActionEvent e) {
              
    }        
        
    public void Paint(Graphics g) {
                    
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      //      Dimension d = getSize();
    //       int gridWidth = 100 / 6;
    //     int gridHeight = 100 / 2;

             Color fg3D = Color.lightGray;

            g2.setPaint(fg3D);
            g2.draw3DRect(0, 0, 100 - 1, 100 - 1, true);
            g2.draw3DRect(3, 3,100 - 7, 100 - 7, false);
           // g2.setPaint(white);            
        }        
        
         public static void main(String[] args) {
            try{
           UIManager.setLookAndFeel(
                UIManager.getCrossPlatformLookAndFeelClassName());
           }
           catch(Exception e){}
           //JFrame.setDefaultLookAndFeelDecorated(true);
                   
           frame = new JFrame("SAVTIMSIM_BUGIVYGI");
           draw_frame app = new draw_frame();
            
           Component contents = app.createGUI();
           frame.getContentPane().add(contents);   
         
           frame.setSize(1100, 700);
           frame.setLocationRelativeTo(null);
            //frame.paint();
           
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });  
            //frame.pack();
            frame.setVisible(true);            
        }
}



Вот у меня есть код как мне тут выделить область для рисования (Желательно справо от кнопки). Моим способом не выходит. 
PM MAIL ICQ   Вверх
powerOn
Дата 10.4.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Рисуй на JPanel. Наследуется от него и переопредели метод paintComponent(). Далее, добавляй его на фрейм куда захочешь.
Вот тебе примерчик:

Код

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class NewJFrame extends javax.swing.JFrame
{
    JPanel drawPanel = new JPanel()
    {
        public void paintComponent(Graphics g)
        {
            int h = getHeight();
            int w = getWidth();
            Graphics2D g2d = (Graphics2D) g;

            g2d.setColor(Color.ORANGE);
            g2d.fillOval(0, 0, w, h);
        }
    };

    public NewJFrame()
    {
        initComponents();
        getContentPane().add(drawPanel, BorderLayout.CENTER);
    }
                         
    private void initComponents()
    {
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("jButton1");
        getContentPane().add(jButton1, java.awt.BorderLayout.LINE_START);

        pack();
    }                      

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }
    private javax.swing.JButton jButton1;
}


Это сообщение отредактировал(а) powerOn - 10.4.2007, 18:42


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Эксперт
***


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

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



а как сюда добавить ScrollBar и чтоб если рисунок к примеру маштабируется тогда появлялся скролл? Это надо на панель скролл добовлять (и также рисовать на Panel) или это какойто нужен компонент со скроллом(и на нём рисовать)? И если можно то в предыдущий пример этим наполнить бо в мануале для самого начала изучения Java сложно как то все со скролом.
PM MAIL ICQ   Вверх
LSD
Дата 11.4.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Надо эту JPanel (на которой рисуешь) поместить в JScrollPane - new JScrollPane(drawPanel), и уже JScrollPane добавлять на форму. Плюс чтобы JScrollPane нормально работал, нужно чтобы твоя JPanel возвращала правильный getPreferredSize(), т.е. такой который ей реально нужен чтобы отрисоваться полностью, с учетом содержимого, масштаба и т.п.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Reptor
Дата 11.4.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Посмотрите пожалуйста или правельно все зделал. Может можно как то более професионально зделать то подскажите?
И как то при прокрутке скролла картинка мажется. Как этого избежать?
Код

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

public class NewJFrame extends javax.swing.JFrame
{
    JPanel drawPanel = new JPanel()
    {
  
        public void paintComponent(Graphics g)
        {
            int h = getHeight();
            int w = getWidth();
            Graphics2D g2d = (Graphics2D) g;

            g2d.setColor(Color.ORANGE);
            g2d.fillOval(0, 0, w, h);
        }
    };

    public NewJFrame()
    {
        initComponents();
        JScrollPane scrollPane = new JScrollPane(drawPanel);
        drawPanel.setPreferredSize(new Dimension(700, 400));
        getContentPane().add(scrollPane, BorderLayout.CENTER);
    }
                         
    private void initComponents()
    {
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("jButton1");
        getContentPane().add(jButton1, java.awt.BorderLayout.LINE_START);

        pack();
    }                      

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
             
             
                JFrame frame = new NewJFrame();
                
                frame.setSize(new Dimension(700,700));
                
                frame.setVisible(true);
                
                
            }
        });
    }
    private javax.swing.JButton jButton1;
}

PM MAIL ICQ   Вверх
powerOn
Дата 11.4.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(Reptor @  11.4.2007,  17:05 Найти цитируемый пост)
И как то при прокрутке скролла картинка мажется. Как этого избежать?

можно добавить следующий код:

Код

drawPanel.addComponentListener(new ComponentAdapter()
{
   public void componentMoved(ComponentEvent e)
   {
        repaint();
   }
});




Это сообщение отредактировал(а) powerOn - 11.4.2007, 21:02


--------------------
user posted image нет времени думать - нужно писать КОД!

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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Reptor @  11.4.2007,  16:05 Найти цитируемый пост)
И как то при прокрутке скролла картинка мажется. Как этого избежать?

У компонента есть свойстово isOpaque(), если он возвращает true, то это значит что он полностью непрозрачный, и закрашивает всю занимаемую им область.
Твой компонент или должен возвращать false:
Код
  JPanel drawPanel = new JPanel()
  {
    {
      setOpaque(false);
    }

или закрашивать всю область:
Код
public void paintComponent(Graphics g)
{
  int h = getHeight();
  int w = getWidth();
  Graphics2D g2d = (Graphics2D) g;
  g2d.setColor(Color.WHITE);
  g2d.fillRect(0, 0, w, h);
  g2d.setColor(Color.ORANGE);
  g2d.fillOval(0, 0, w, h);
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0795 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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