Guten Tag,
ich versuche mittels eines GUIs auf einen JPanel zu zeichnen. Ich habe dies auch erst erfolgreich geschafft, allerdings indem ich getGraphics() benutzt habe. Schnell wurde klar, dass dies nicht der richtige Lösungsansatz ist und ich mit paintComponent() arbeiten muss.
Ich habe in einem JMenu 2 Einträge über die ich Kreise oder Rechtecke zeichnen möchte,
momentan ist es mein Ziel einfach nur " gg.drawOval(100, 100, 100, 100); " welches in paintComponent() ist umzusetzen. Leider vergebens.
Es hieß ich solle meine zu zeichnenden Objekte in Listen speichern und so durchiterieren wenn ich zeichne, leider ist mir nicht klar wie ich dies umsetzen kann.
Bitte guckt euch die Klasse RandomDrawer an. Ich soll mit den Zeichenmethoden der Klasse Graphics2D zeichen.
Was mache ich falsch? Hier mein text:
ich versuche mittels eines GUIs auf einen JPanel zu zeichnen. Ich habe dies auch erst erfolgreich geschafft, allerdings indem ich getGraphics() benutzt habe. Schnell wurde klar, dass dies nicht der richtige Lösungsansatz ist und ich mit paintComponent() arbeiten muss.
Ich habe in einem JMenu 2 Einträge über die ich Kreise oder Rechtecke zeichnen möchte,
momentan ist es mein Ziel einfach nur " gg.drawOval(100, 100, 100, 100); " welches in paintComponent() ist umzusetzen. Leider vergebens.
Es hieß ich solle meine zu zeichnenden Objekte in Listen speichern und so durchiterieren wenn ich zeichne, leider ist mir nicht klar wie ich dies umsetzen kann.
Bitte guckt euch die Klasse RandomDrawer an. Ich soll mit den Zeichenmethoden der Klasse Graphics2D zeichen.
Was mache ich falsch? Hier mein text:
Java:
package plotterpackage;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.List;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.text.JTextComponent;
public class PlotterApp implements ComponentListener {
private JFrame frame;
private JPanel canvas;
private JPanel statusBar;
private JTextField status;
/**
* Public default constructor.
*/
public PlotterApp() {
initialize();
}
/**
* Start of the application.
* @param args command line arguments
*/
public static void main(String[] args) {
PlotterApp app = new PlotterApp();
app.start();
}
/**
* Initialize the application.
*/
protected void initialize() {
frame = new JFrame("Main");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setBounds(50,50, 50+640, 50+480);
frame.setBackground(Color.GREEN);
frame.setJMenuBar(createMenuBar());
frame.getContentPane().add(createContent(), BorderLayout.CENTER);
frame.getContentPane().add(createStatusBar(),BorderLayout.SOUTH);
}
/**
* Start the graphical user interface.
*/
public void start() {
// show the GUI
frame.setVisible(true);
status.setText("Application started");
}
/**-*
* Internal helper to create the main content.
* @return component with application content.
*/
protected JComponent createContent() {
canvas = new JPanel();
canvas.addMouseListener(new Painter());
canvas.addMouseMotionListener(new Painter());
canvas.addComponentListener(this);
canvas.setBackground(new Color(128,218,255));
canvas.setForeground(Color.RED);
canvas.setBorder(new BevelBorder(BevelBorder.LOWERED));
return canvas;
}
/**
* Internal helper to create the statusbar and -fields.
* @return component with status/bar.
*/
protected JComponent createStatusBar() {
FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
layout.setHgap(5);
statusBar = new JPanel(layout);
statusBar.add(new JLabel("Status: "));
status = new JTextField();
status.setPreferredSize(new Dimension(400,25));
status.setEditable(false);
status.setBorder(new BevelBorder(BevelBorder.RAISED,Color.MAGENTA,Color.LIGHT_GRAY));
status.getInsets().set(2, 10, 2, 10);
statusBar.add(status);
return statusBar;
}
/**
* Internal helper to create the frames menubar.
* @return menu bar
*/
protected JMenuBar createMenuBar() {
JMenuBar mb = new JMenuBar();
JMenuItem item;
JMenu menu;
// Action menu
menu = new JMenu("Actions");
mb.add(menu);
item = new JMenuItem("Draw RandomCircle");
item.addActionListener(new RandomDrawer());
menu.add(item);
item = new JMenuItem("Draw RandomRectangle");
item.addActionListener(new RandomDrawer());
menu.add(item);
item = new JMenuItem("check array");
item.addActionListener(new RandomDrawer());
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Exit");
item.addActionListener(new AppCloser());
menu.add(item);
// Color menu not used so far
menu = new JMenu("Colors");
mb.add(menu);
// Help menu not used so far
menu = new JMenu("Help");
mb.add(menu);
return mb;
}
class AppCloser implements ActionListener {
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("application finished, bye-bye... ");
frame.setVisible(false);
frame.dispose();
System.exit(0);
}
}
class DrawShape {
public DrawShape() {
// TODO Auto-generated constructor stub
}
public DrawShape(String string) {
// TODO Auto-generated constructor stub
}
}
class RandomDrawer extends JPanel implements ActionListener {
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
private List<DrawShape> shapes = new ArrayList<DrawShape>();
public void addShape(DrawShape s) {
shapes.add(s);
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
final Graphics2D gg = (Graphics2D) g;
gg.setColor(Color.BLACK);
gg.drawOval(100, 100, 100, 100);
}
@Override
public void actionPerformed(ActionEvent e) {
Random generator = new Random();
int x = generator.nextInt(100)+100;
int y = generator.nextInt(100)+100;
if (e.getActionCommand()==("Draw RandomCircle")) {
System.out.printf("x = %d y = %d\n", x, y);
//status.setText(String.format("rnd draw x:%d y:%d ", x, y));
DrawShape shape = new DrawShape();
addShape(shape);
int count = shapes.size();
System.out.printf("objects in array: %d\n", count);
//repaint();
}
else if (e.getActionCommand()==("Draw RandomRectangle")) {
System.out.printf("x = %d y = %d\n", x, y);
DrawShape shape = new DrawShape();
addShape(shape);
int count = shapes.size();
System.out.printf("objects in array: %d\n", count);
//status.setText(String.format("rnd draw x: y: "));
//Graphics2D gg = (Graphics2D) canvas.getGraphics();
//gg.setColor(Color.BLACK);
//gg.drawRect(x, y, generator.nextInt(x), generator.nextInt(y));
}
else {
int ss = shapes.size();
System.out.printf("objects in ARRAY: %d\n", ss);
}
}
}
class Painter extends MouseAdapter implements MouseMotionListener {
Point start, end;
int startX, startY, oldX, oldY, oldWidth, oldHeight;
public void mousePressed(MouseEvent e) {
start = e.getPoint();
oldX = startX;
oldY = startY;
startX = e.getX();
startY = e.getY();
status.setText(String.format("Mouse start: " + start));
}
public void mouseDragged(MouseEvent e) {
//Graphics2D gc = (Graphics2D)canvas.getGraphics();
//gc.setColor(new Color(128, 218, 255));
//gc.drawOval(oldX, oldY, oldWidth, oldHeight);
System.out.printf("oldWidth ist = %3d, oldHeight ist = %3d\n", oldWidth, oldHeight);
oldWidth = e.getX();
oldHeight = e.getY();
//gc.setColor(Color.BLACK);
//gc.drawOval(startX, startY, e.getX(), e.getY());
}
public void mouseReleased(MouseEvent e) {
end = e.getPoint();
status.setText(String.format("Mouse end: " + end));
}
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentResized(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
}