Следующая программа должна разрешить рисование свободной рукой на одном кадре, а другая - на кнопку, чтобы открыть селектор цветов. Код основного класса можно найти:Свободная ручная рисование на 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
Пожалуйста, помогите мне понять, что я сделал неправильно.
[Использование нескольких JFrames, хорошая/плохая практика?] (Http://stackoverflow.com/q/9554636/418556) – MadProgrammer
Смотрите это '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
haha: P Спасибо за редактирование/очистка сообщения, я новичок на сайте и не очень хочу, чтобы попробовать и усложнить его, впутывая все это: s – Jordan