1

У меня проблема с JFrame, который неправильно рисуется. Может кто-нибудь взглянуть на решение, пожалуйста? Я пробовал использовать BoxLayouts, но он тоже не работает. Кнопки не отображаются, пока я не накину их.Java SWING Не правильно рисовать

Это все в одном файле и исполняемый файл.

С уважением

package Executable; 

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Whiteboard implements ActionListener 
{ 
JFrame frame; 
public static Color drawColor = Color.BLACK; 
public static String drawShape = "line"; 
JButton redButton, blueButton, blackButton, greenButton, circleButton,   lineButton, rectangleButton; 

public static void main(String[] args) 
{ 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       Whiteboard window = new Whiteboard(); 
       window.frame.setVisible(true); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public Hw11() 
{ 
    initialize(); 
} 

private void initialize() 
{ 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 686, 464); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JPanel toolpanel = new JPanel(); 
    toolpanel.setBounds(10, 11, 652, 48); 
    frame.getContentPane().add(toolpanel); 
    toolpanel.setLayout(null); 

    blackButton = new JButton(); 
    blackButton.setBackground(Color.BLACK); 
    blackButton.setBounds(10, 11, 89, 26); 
    blackButton.addActionListener(this); 
    toolpanel.add(blackButton); 

    redButton = new JButton(); 
    redButton.setBackground(Color.RED); 
    redButton.setBounds(101, 11, 89, 26); 
    redButton.addActionListener(this); 
    toolpanel.add(redButton); 

    greenButton = new JButton(); 
    greenButton.setBackground(Color.GREEN); 
    greenButton.setBounds(192, 11, 89, 26); 
    greenButton.addActionListener(this); 
    toolpanel.add(greenButton); 

    blueButton = new JButton(); 
    blueButton.setBackground(Color.BLUE); 
    blueButton.setBounds(283, 11, 89, 26); 
    blueButton.addActionListener(this); 
    toolpanel.add(blueButton); 

    circleButton = new JButton("Circle"); 
    circleButton.setBounds(465, 11, 89, 26); 
    circleButton.addActionListener(this); 
    toolpanel.add(circleButton); 

    lineButton = new JButton("Line"); 
    lineButton.setBounds(374, 11, 89, 26); 
    lineButton.addActionListener(this); 
    toolpanel.add(lineButton); 

    rectangleButton = new JButton("Rect"); 
    rectangleButton.setBounds(555, 11, 89, 26); 
    rectangleButton.addActionListener(this); 
    toolpanel.add(rectangleButton); 

    DrawPanel whiteboard = new DrawPanel(); 
    whiteboard.setBounds(10, 63, 652, 351); 
    frame.getContentPane().add(whiteboard); 
} 

public void actionPerformed(ActionEvent e) 
{ 
    if (e.getSource() == redButton) 
     drawColor = Color.RED; 
    else if (e.getSource() == blueButton) 
     drawColor = Color.BLUE; 
    else if (e.getSource() == blackButton) 
     drawColor = Color.BLACK; 
    else if (e.getSource() == greenButton) 
     drawColor = Color.GREEN; 
    else if (e.getSource() == lineButton) 
     drawShape = "line"; 
    else if (e.getSource() == circleButton) 
     drawShape = "circle"; 
    else if (e.getSource() == rectangleButton) 
     drawShape = "rect"; 
} 
} 

class DrawPanel extends JPanel implements MouseListener, MouseMotionListener 
{ 
private Point p1, p2, p3; 
ArrayList<Shape> shapes = new ArrayList<>(); 
Shape temp; 

public DrawPanel() 
{ 
    setBackground(Color.WHITE); 
    addMouseListener(this); 
    addMouseMotionListener(this); 
} 

public void mousePressed(MouseEvent e) 
{ 
    p1 = e.getPoint(); 
} 

public void mouseReleased(MouseEvent e) 
{ 
    p2 = e.getPoint(); 
    Shape s = null; 
    if (Hw11.drawShape.equals("line")) 
    { 
     s = new Line(p1, p2, Hw11.drawColor); 
    } 
    else if (Hw11.drawShape.equals("circle")) 
    { 
     s = new Circle(p1, p2, Hw11.drawColor); 
    } 
    else if (Hw11.drawShape.equals("rect")) 
    { 
     s = new Rectangle(p1, p2, Hw11.drawColor); 
    } 
    shapes.add(s); 
    Graphics g = getGraphics(); 
    paint(g); 
} 

public void paintBackground() 
{ 
    setBackground(Color.WHITE); 
} 

@Override 
public void paintComponent(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f)); 
    paintBackground(); 
    super.paintComponent(g2); 
    temp.draw(g); 
    for (int i = 0; i < shapes.size(); i++) 
    { 
     Shape s = shapes.get(i); 
     s.draw(g); 
    } 
} 

public void mouseDragged(MouseEvent e) 
{ 
    p3 = e.getPoint(); 

    if (Hw11.drawShape.equals("line")) 
    { 
     temp = new Line(p1, p3, Hw11.drawColor); 
    } 
    else if (Hw11.drawShape.equals("circle")) 
    { 
     temp = new Circle(p1, p3, Hw11.drawColor); 
    } 
    else if (Hw11.drawShape.equals("rect")) 
    { 
     temp = new Rectangle(p1, p3, Hw11.drawColor); 
    } 
    Graphics g = getGraphics(); 
    paint(g); 
} 

public void mouseMoved(MouseEvent e) 
{ 

} 

public void mouseClicked(MouseEvent e) 
{ 

} 

public void mouseEntered(MouseEvent e) 
{ 

} 

public void mouseExited(MouseEvent e) 
{ 

} 
} 

abstract class Shape 
{ 
Point p1; 
Point p2; 
Color c; 

public Shape(Point p1, Point p2, Color c) 
{ 
    this.p1 = p1; 
    this.p2 = p2; 
    this.c = c; 
} 

public abstract void draw(Graphics g); 
} 

class Line extends Shape 
{ 
public Line(Point p1, Point p2, Color c) 
{ 
    super(p1, p2, c); 
} 

@Override 
public void draw(Graphics g) 
{ 
    g.setColor(c); 
    g.drawLine(p1.x, p1.y, p2.x, p2.y);//draw line p1 - p2 
} 

} 


class Circle extends Shape 
{ 
public Circle(Point p1, Point p2, Color c) 
{ 
    super(p1, p2, c); 
} 

@Override 
public void draw(Graphics g) 
{ 
    g.setColor(c); 
    int r = (int)Math.sqrt((p2.x-p1.x)*(p2.x-p1.x) + (p2.y-p1.y)*(p2.y-p1.y)); 
    g.drawOval(p1.x, p1.y - (r/2), r, r);//draw circle p1 - p2 
} 
} 

class Rectangle extends Shape 
{ 
public Rectangle(Point p1, Point p2, Color c) 
{ 
    super(p1, p2, c); 
} 

@Override 
public void draw(Graphics g) 
{ 
    g.setColor(c); 
    int width = p2.x - p1.x; 
    int height = p2.y - p1.y; 
g.drawRect(p1.x, p1.y, width, height);//draw rect p1 - p2 
} 
} 
+1

При выполнении я получаю исключение нулевого указателя, поскольку temp не задан в DrawPanel.paintComponent (строка 178). – irene

+1

Я добавил проверку 'if (temp! = Null) {temp.draw (g);}' и ist работает. – irene

ответ

0

Ваш Shape temp объявлен как поле класса, но он инициализируется в public void mouseDragged(MouseEvent e). Итак, это значение null перед первым действием перетаскивания, а в temp.draw(g); оно дает исключение.

+0

Спасибо && также благодаря Ирен. Какая ошибка новобранец - Не проверять консоль !! –

1

Здесь есть несколько проблем, помимо исключения NullPointerException.

Вы не должны называть paint непосредственно:

Graphics g = getGraphics(); 
paint(g); 

repaint(); Используйте вместо paint(getGraphics());.

Вы не должны быть изменения Graphics переданных в paintComponent:

Graphics2D g2 = (Graphics2D) g; 
g2.setRenderingHint(...); 
g2.setComposite(...); 

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

Вместо этого создайте копию:

Graphics2D g2 = (Graphics2D) g.create(); 

g2.setRenderingHint(...); 
g2.setComposite(...); 
... 

// and dispose it at the end of paintComponent 
g2.dispose(); 

Вы не должны быть изменения состояния компонентов внутри paintComponent:

public void paintBackground() 
{ 
    setBackground(Color.WHITE); 
} 

@Override 
public void paintComponent(Graphics g) 
{ 
    ... 
    paintBackground(); 

Делать это может вызвать бесконечный цикл перерисовку, потому что setBackground перерисовки если цвет другой.

Вместо этого используйте g.fillRect(...) или g.clearRect(...).

+1

Я скучаю там super.paintComponent как верхний – mKorbel

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

  • Нет связанных вопросов^_^