2016-05-07 3 views
1

Я пытаюсь создать простое приложение, которое рисует графики ...изображения чертежа на компоненте Java

package Tests.Drawing; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.border.EtchedBorder; 

public class DrawingTest extends JFrame 
{ 
    private Canvas drwArea; 
    private JButton btnClear; 

    public static void main(String[] args) 
    { 
     DrawingTest StartForm = new DrawingTest(); 
     StartForm.setVisible(true); 
    } 


    public DrawingTest() 
    { 
     //Window... 
     this.setTitle("Drawing objects test00"); 
     this.setBounds(0,0,510,500); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLayout(null); 
     //Drawing area... 
     drwArea = new Canvas(); 
     drwArea.setBounds(0, 0, 400, 450);  
     drwArea.setBackground(Color.WHITE); 
     drwArea.setOpaque(true); 
     drwArea.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); 
     drwArea.addMouseMotionListener(new MouseMotionAdapter() 
     { 
      @Override 
      public void mouseDragged(MouseEvent e) 
      { 
       //Write code to paint on the image... 
      } 
     }); 

     this.getContentPane().add(drwArea); 
     //Clear button... 
     btnClear = new JButton("Clear"); 
     btnClear.setBounds(410,50,70,30); 
     btnClear.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       //Write code to clear the image... 
      } 
     }); 

     this.getContentPane().add(btnClear); 

    } 

    private class Canvas extends JLabel 
    { 
     @Override 
     public void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 
      //The idea of overriding this method is 
      //achieving persistence... 
     } 
    } 

} 

Я видел, что типичный компонент для рисования на это JLabel (Есть ли кто-нибудь лучше, путь?). Используя метод getGraphics, я могу использовать объект, который имеет несколько методов для рисования на компоненте. Моя проблема в том, что вместо рисования непосредственно на JLabel я хотел бы нарисовать изображение (в памяти), и как только картина закончится, отправьте результат в JLabel. Как я могу это сделать? Я немного потерял ...

Заранее спасибо.

+0

Если у вас есть вопросы по поводу моего ответа, пожалуйста, спросите! –

+0

'Я видел, что типичный компонент для рисования - это Jlabel' - вы не« рисуете »на JLabel (то есть вы не переопределяете paintComponent(), чтобы рисовать). Вы можете использовать JLabel для отображения ImageIcon. Если вы хотите нарисовать что-то, вы, как правило, либо нарисуете «JPanel», либо «BufferedImage». См. [Пользовательские подходы к рисованию] (https://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/) для рабочих примеров обоих этих подходов. – camickr

ответ

2

Я хотел бы нарисовать на изображении (в памяти)

Я полагаю, что вы затем создать BufferedImage объект нужного размера, получить его объект Graphics2D по телефону createGraphics() на него, и рисовать на нем, используя этот объект Graphics2D.

и после того, как картина закончена, отправить результат в JLabel

Затем создайте ImageIcon из BufferedImage выше, просто вызывая

Icon myIcon = new ImageIcon(myBufferedImage); 

и затем установить значок метки JLabel через myLabel.setIcon(myIcon);

Также вы можете нарисовать BufferedImage, который отображается в paintCompo от JPanel и это может быть еще лучше, если вы хотите обновить изображение во время работы программы. Подробнее об этом, пожалуйста, посмотрите на некоторые из these examples.

Другие комментарии:

  • Не рисовать с графическим объектом, полученный путем вызова getGraphics() на компоненте. Это вернет объект Graphics, который недолговечен, рискуя исчезнуть графикой или, что еще хуже, исключение NullPointerException. Вместо этого нарисуйте метод JPANEL paintComponent(...) прямо или косвенно, опираясь на BufferedImage (да, вы можете получить свой объект Graphics через getGraphics()), а затем рисовать BufferedImage в GUI в методе paintComponent.
  • В то время как пустые макеты и setBounds() могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного ,
+0

Спасибо! Он работал безупречно. Только то, что я хотел. Следуя советам по макетам. – Juan

Смежные вопросы