2014-10-16 12 views
0

Следующая программа должна разрешить рисование свободной рукой на одном кадре, а другая - на кнопку, чтобы открыть селектор цветов. Код основного класса можно найти:Свободная ручная рисование на JFrame, Color + Point [] Сохранение и рендеринг с ошибкой

package clickTesting; 

import Desksnap.Utils.Line; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.LinkedList; 
import java.util.List; 


public class Main { 
    public static Color currentColor = null; 

    public static void main(String[] args) { 
     Viewer gui = new Viewer(); 
     button gui1 = new button(); 
     gui.setVisible(true); 
     gui1.setVisible(true); 
     boolean lol = true; 
     while (lol) { 
      gui.repaint(500); 
     } 
    } 


    static class Viewer extends JFrame implements MouseMotionListener, MouseListener { 
     public List<Line> lines = new LinkedList<Line>(); 
     private int index = 0; 
     private Point[] arr = new Point[100000]; 

     public Viewer() { 
      addMouseListener(this); 
      addMouseMotionListener(this); 
     } 

     private void initComponents() { 
      PhotoWindow = new JFrame(); 
      setUndecorated(true); 
      { 
       Container PhotoWindowContentPane = PhotoWindow.getContentPane(); 
       PhotoWindowContentPane.setLayout(null); 
       PhotoWindowContentPane.setPreferredSize(new Dimension(410, 539)); 
       PhotoWindow.pack(); 
       PhotoWindow.setLocationRelativeTo(PhotoWindow.getOwner()); 
       addMouseListener(this); 


      } 
     } 

     private JFrame PhotoWindow; 


     @Override 
     public void mousePressed(MouseEvent e) { 
      arr[index] = new Point(e.getX(), e.getY()); 
      index++; 
      System.out.println(index); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      lines.add(new Line(Main.currentColor, arr)); 
      arr = new Point[100000]; 
      index = 0; 
      System.out.println("Released"); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      arr[index] = new Point(e.getX(), e.getY()); 
      index++; 
      System.out.println(index); 
     } 


     @Override 
     public void paint(Graphics g) { 
      super.paintComponents(g); 
      if (lines.size() >= 0) { 
       for (Line z : lines) { 
        if (z != null) { 
         Point[] lel = z.getLine(); 
         g.setColor(z.getColor()); 
         if (lel != null) { 
          for (int i = 0; i < lel.length; i++) 
           if (lel[i] != null) { 
            g.drawLine(lel[i].x, lel[i].y, lel[i + 1].x, lel[i + 1].y); 
           } 
         } else { 
          System.out.println("Nope"); 
         } 
        } 
       } 
      } else { 
       System.out.println("Nothing In List Yet!"); 
      } 
     } 


     //Unused 
     @Override 
     public void mouseEntered(MouseEvent e) { 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
     } 

     @Override 
     public void mouseClicked(MouseEvent e) { 
     } 
    } 


    public static class button extends JFrame implements MouseMotionListener, MouseListener { 
     public button() { 
      this.addMouseListener(this); 
      this.addMouseMotionListener(this); 
     } 

     private void initComponents() { 
      PhotoWindow = new JFrame(); 
      setUndecorated(true); 
      { 
       Container PhotoWindowContentPane = PhotoWindow.getContentPane(); 
       PhotoWindowContentPane.setLayout(null); 
       PhotoWindowContentPane.setPreferredSize(new Dimension(410, 539)); 
       PhotoWindow.pack(); 
       PhotoWindow.setLocationRelativeTo(PhotoWindow.getOwner()); 
       addMouseListener(this); 
      } 
     } 

     private JFrame PhotoWindow; 


     @Override 
     public void mousePressed(MouseEvent e) { 
      JColorChooser color = new JColorChooser(); 
      Main.currentColor = color.showDialog(
        button.this, 
        "Choose Background Color", 
        Color.BLACK); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
     } 

     @Override 
     public void mouseClicked(MouseEvent e) { 
     } 
    } 
} 

Этот класс поддерживает рисунок, запись линий и основного цикла:

package Desksnap.Utils; 

import java.awt.*; 
import java.util.*; 
import java.util.List; 


public class Line { 
    Color color = null; 
    Point[] points = null; 

public Line(Color color, Point[] points){ 
    color = this.color; 
    points = this.points; 
} 

    public Color getColor(){ 
     return color; 
    } 
    public Point[] getLine(){ 
     return points; 
    } 


} 

Это класс используется линия.

После рисования линии программа просто печатает «Nope» в консоли.

Выход: Нету х 10000000

Пожалуйста, помогите мне понять, что я сделал неправильно.

+0

[Использование нескольких JFrames, хорошая/плохая практика?] (Http://stackoverflow.com/q/9554636/418556) – MadProgrammer

+0

Смотрите это 'while (lol) {gui.repaint (500);}' this is 'while (true) {System.out.println (" Очень плохо ");}'! Вы не контролируете процесс рисования в Swing, Swing расскажет вам, когда он хочет что-то нарисовать, и вы ответите на этот запрос. 'repaint' - это« запрос », который вы делаете в« RepaintManager », чтобы сообщить ему, что вы хотите обновить его, если сочтет это уместным. См. [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) и [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting/) для получения более подробной информации о картине – MadProgrammer

+0

haha: P Спасибо за редактирование/очистка сообщения, я новичок на сайте и не очень хочу, чтобы попробовать и усложнить его, впутывая все это: s – Jordan

ответ

0

Начнем с того, никогда не делать ...

while (lol) { 
    gui.repaint(500); 
} 

Вы не контролируете процесс краски, то есть домен RepaintManager. Если вы хотите, чтобы ваш компонент обновлялся, используйте repaint ONCE и дайте RepaintManager понять это.

Ядро вашей проблемы здесь ...

public Line(Color color, Point[] points) { 
    color = this.color; 
    points = this.points; 
} 

Вы назначаете значения this.color к color и this.points к points, который не имеет никакого эффекта. Вы должны назначить им наоборот (color к this.color)

Вы также хотите, чтобы поближе посмотреть на:

Вызов super.paintComponents изнутри paint - плохая идея, вы должны быть c alling super.paint и пусть он позаботится о соответствующих вызовах краски.

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

Затем вы можете добавить этот компонент в контейнер, который хотите.

+0

Большое спасибо! Это фиксировало проблему nope и, похоже, перекрыло все проблемы, связанные с ней. Мульти GUI только до тех пор, пока я не надену кнопку на основной, это не программа, над которой я работаю только в одном аспекте в очень простой/плохой форме для привязки. Единственная проблема теперь после того, как вытягивание/высвобождение не будет нарисовано на кадре больше XD – Jordan

+0

Как я намекнул, вызовите 'repaint' в методе' mouseReleased' ... – MadProgrammer

+0

Я вижу^_^работал для первого line, но не нарисовал никаких других, просто вытащил ошибки – Jordan