Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > 2Д графика


Автор: Reptor 10.4.2007, 17:52
Вопрос состоит в следующем : возможно ли рисовать на 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);            
        }
}



Вот у меня есть код как мне тут выделить область для рисования (Желательно справо от кнопки). Моим способом не выходит. 

Автор: powerOn 10.4.2007, 18:42
Рисуй на 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;
}

Автор: Reptor 11.4.2007, 15:42
а как сюда добавить ScrollBar и чтоб если рисунок к примеру маштабируется тогда появлялся скролл? Это надо на панель скролл добовлять (и также рисовать на Panel) или это какойто нужен компонент со скроллом(и на нём рисовать)? И если можно то в предыдущий пример этим наполнить бо в мануале для самого начала изучения Java сложно как то все со скролом.

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

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

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;
}

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

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

Код

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



Автор: LSD 11.4.2007, 22:20
Цитата(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);
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)