Hallo Gemeinschaft,
habe einen kleinen Code entworfen der Punkte auf Klick auf einer Zeichenfläche ausgibt. So weit so gut das geht auch alles, aber ....
1.) wenn ich mit "insert" viele viele Punkte setze und anschließend aus dem Menu "neu" wähle, dann bleiben grundsätzlich Punkte auf der rechten Seite der Zeichnfläche stehen. Diese Punkte befinden sich aber definitiv nicht mehr in der ArrayList. Diese verschwinden auch, wenn ich die Zeichenfläche manuell verkleinere oder vergrössere oder ich aus dem Menu "insert", "delete" oder "move" wähle. Geht das nur mir so?? Könntet ihr das mal ausprobieren? Ja und falls es bei euch auch so ist, warum???
2. in der Klasse MenuAktion befinden sich viele viele boolean Werte. Kann man das auch vereinfachen ohne das die Funktionalität beeinflusst wird??
ich danke euch für eure Mühe ....
habe einen kleinen Code entworfen der Punkte auf Klick auf einer Zeichenfläche ausgibt. So weit so gut das geht auch alles, aber ....
1.) wenn ich mit "insert" viele viele Punkte setze und anschließend aus dem Menu "neu" wähle, dann bleiben grundsätzlich Punkte auf der rechten Seite der Zeichnfläche stehen. Diese Punkte befinden sich aber definitiv nicht mehr in der ArrayList. Diese verschwinden auch, wenn ich die Zeichenfläche manuell verkleinere oder vergrössere oder ich aus dem Menu "insert", "delete" oder "move" wähle. Geht das nur mir so?? Könntet ihr das mal ausprobieren? Ja und falls es bei euch auch so ist, warum???
2. in der Klasse MenuAktion befinden sich viele viele boolean Werte. Kann man das auch vereinfachen ohne das die Funktionalität beeinflusst wird??
ich danke euch für eure Mühe ....
Java:
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.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.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
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.filechooser.FileFilter;
/**
* Dieses Programm stellt dem Benutzer eine grafische Benutzeroberfläche zur
* Verfügung, womit dieser auf einer Zeichenfläche Punkte (Kreise) zeichnen,
* löschen und verschieben kann. Dabei kann der Benutzer die Interaktionen
* aus ein Menu wählen.
*
*
*/
public class MyGraphEditor extends JFrame{
private static final long serialVersionUID = 2819070241694183052L;
// Variablen initialisieren
private final PunktVerarbeiten zeichnenFenster = new PunktVerarbeiten();
private boolean insertPoint = false;
private boolean deletePoint = false;
private boolean movePoint = false;
@SuppressWarnings("unused")
private boolean nonePoint = false;
@SuppressWarnings("unused")
private boolean openP = false;
@SuppressWarnings("unused")
private boolean newP = false;
@SuppressWarnings("unused")
private boolean saveP = false;
private boolean correctPoint = false;
private ArrayList<Point> kreise;
Point ls1;
Point ls2;
Point ls3;
final int radius = 10;
private final JMenuBar mb;
private final JMenu graph, vertex;
private final JMenuItem open, neu, save, insert, move, delete, none;
private final JFileChooser jfc = new JFileChooser();
JLabel label;
JTextField text;
// Kontruktor erstellen
public MyGraphEditor(){
final JFrame frame = new JFrame("MyGraphEditor");
// Menu erstellen
mb = new JMenuBar();
// Menuitem Graph erstellen
graph = new JMenu("Graph");
open = new JMenuItem("open");
open.addActionListener(new MenuAktion());
graph.add(open);
graph.addSeparator();
neu = new JMenuItem("new");
neu.addActionListener(new MenuAktion());
graph.add(neu);
graph.addSeparator();
save = new JMenuItem("save");
save.addActionListener(new MenuAktion());
graph.add(save);
graph.addSeparator();
// Menuitem Vertex erstellen
vertex = new JMenu("Vertex");
insert = new JMenuItem("insert");
insert.addActionListener(new MenuAktion());
vertex.add(insert);
vertex.addSeparator();
delete = new JMenuItem("delete");
delete.addActionListener(new MenuAktion());
vertex.add(delete);
vertex.addSeparator();
move = new JMenuItem("move");
move.addActionListener(new MenuAktion());
vertex.add(move);
vertex.addSeparator();
none = new JMenuItem("none");
none.addActionListener(new MenuAktion());
vertex.add(none);
mb.add(graph);
mb.add(vertex);
// Panel + Label + Textfeld erstellen
final JPanel panel = new JPanel(new FlowLayout());
text = new JTextField("none", 20);
text.setEditable(false);
label = new JLabel("Selected Action");
panel.add(label);
panel.add(text);
// Frame zusammenstellen
frame.setJMenuBar(mb);
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
zeichnenFenster.setPreferredSize(new Dimension(800,500));
frame.add(zeichnenFenster,BorderLayout.CENTER);
frame.add(panel,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
//mit dieser Methode wird der JFileChooser erweitert
//um einen Filter für .xml Dateien
jfc.addChoosableFileFilter(new FileFilter(){
public boolean accept(File f) {
if (f.isDirectory()) return true;
return f.getName().toLowerCase().endsWith(".xml");
}
public String getDescription() {
// TODO Auto-generated method stub
return ".xml";
}
});
}
/**
* Diese Klasse zeichnet die Punkte (Kreise) und legt die
* Mausinteraktionen fest.
*
*/
class PunktVerarbeiten extends JComponent implements MouseListener{
private static final long serialVersionUID = -7292895371227480384L;
// Kontruktor erstellen.
public PunktVerarbeiten() {
kreise = new ArrayList<Point>();
addMouseListener(this) ;
}
// Festlegen der Zeichenflächenfarbe, der Punktfarbe und zeichnen
// der Kreise.
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
final Graphics2D g2D = (Graphics2D) g;
g2D.setColor(Color.white);
g2D.fillRect(0,0,getWidth(), getHeight());
g2D.setColor(Color.black);
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
for (final Point p : kreise){
g2D.fillOval(p.x-10/2, p.y-10/2, radius, radius);
}
}
// festlegen der Mausinteraktionen
public void mouseClicked(final MouseEvent e) {
// wenn insert aus dem Menu erwählt wurde, dann wird in der
// Zeichenfläche beim Klick ein Punkt gezeichnet und
// gleichzeitig werden die Koordinaten der ArrayList kreise
// hinzugefügt.
if (insertPoint == true){
ls1 = e.getPoint();
kreise.add(ls1);
repaint();
}
// wenn delete aus dem Menu erwählt wurde, dann wird beim
// Klick auf die Zeichenfläche überprüft, ob der Klick in
// der Nähe eines Punktes ist. Wenn der Klick innerhalb
// eines Punktes, wird dieser gelöscht, parallel zum
// Löschen aus der ArrayList kreise.
else if (deletePoint){
ls1 = e.getPoint();
for(final Iterator<Point> iterator = kreise.iterator();
iterator.hasNext();){
final Point p = iterator.next();
ls2 = e.getPoint();
if(p.distance(ls2) <= (radius/2)){
iterator.remove();
repaint();
}
}
}
}
public void mousePressed(final MouseEvent e) {
// wenn move aus dem Menu erwählt wurde, dann wird beim
// Maus gedrückt halten, die Koordinate vom dem zu
// versetzenden Kreis gespeichert, wenn der Klick
// innerhalb eines Kreise liegt.
if(movePoint){
ls1 = e.getPoint();
for(final Iterator<Point> iterator = kreise.iterator();
iterator.hasNext();){
final Point p = iterator.next();
ls2 = e.getPoint();
if(p.distance(ls2) <= (radius/2)){
ls3 = p;
movePoint = true;
correctPoint = true;
}
}
}
}
public void mouseReleased(final MouseEvent e) {
// wenn move aus dem Menu erwählt wurde, dann wird beim
// Maus loslassen der Punkt versetzt, wenn MousePressed
// positiv abgeschlossen wurde, gleichzeitig wird der
// ArrayList kreise die Koordinaten des Punktes
// hinzugefügt und die alten Werte des Punktes gelöscht.
if(movePoint & correctPoint){
ls1 = e.getPoint();
kreise.add(ls1);
kreise.remove(ls3);
correctPoint = false;
repaint();
}
}
public void mouseEntered(final MouseEvent e) {}
public void mouseExited(final MouseEvent e) {}
}
/**
* Diese Klasse setzt die Parameter für die Menuauswahl und setzt
* den Text im JTextField.
*
*/
class MenuAktion implements ActionListener {
@Override
public void actionPerformed(final ActionEvent e) {
// bei Menuauswahl open, Paramter neu setzen
if (e.getActionCommand() == open.getText()) {
insertPoint = false;
deletePoint = false;
movePoint = false;
nonePoint = false;
openP = true;
newP = false;
saveP = false;
text.setText("Graph:" + e.getActionCommand());
if (jfc.showOpenDialog(open) == JFileChooser.APPROVE_OPTION) {
File file = jfc.getSelectedFile();
System.out.println("mit Datei arbeiten");
}
}
// bei Menuauswahl new, Paramter neu setzen
else if (e.getActionCommand() == neu.getText()) {
insertPoint = false;
deletePoint = false;
movePoint = false;
nonePoint = false;
openP = false;
newP = true;
saveP = false;
text.setText("Graph:" + e.getActionCommand());
kreise.clear();
repaint();
}
// bei Menuauswahl save, Paramter neu setzen
else if (e.getActionCommand() == save.getText()){
insertPoint = false;
deletePoint = false;
movePoint = false;
nonePoint = false;
openP = false;
newP = false;
saveP = true;
text.setText("Graph:" + e.getActionCommand());
if (jfc.showSaveDialog(save) == JFileChooser.APPROVE_OPTION) {
File file = jfc.getSelectedFile();
System.out.println("save");
}
}
// bei Menuauswahl insert, Paramter neu setzen
else if (e.getActionCommand() == insert.getText()){
insertPoint = true;
deletePoint = false;
movePoint = false;
nonePoint = false;
openP = false;
newP = false;
saveP = false;
text.setText("Vertex:" + e.getActionCommand());
}
// bei Menuauswahl delete, Paramter neu setzen
else if (e.getActionCommand() == delete.getText()){
insertPoint = false;
deletePoint = true;
movePoint = false;
nonePoint = false;
openP = false;
newP = false;
saveP = false;
text.setText("Vertex:" + e.getActionCommand());
}
// bei Menuauswahl move, Paramter neu setzen
else if (e.getActionCommand() == move.getText()){
insertPoint = false;
deletePoint = false;
movePoint = true;
nonePoint = false;
openP = false;
newP = false;
saveP = false;
text.setText("Vertex:" + e.getActionCommand());
}
// bei Menuauswahl none, Paramter neu setzen
else if (e.getActionCommand() == none.getText()){
insertPoint = false;
deletePoint = false;
movePoint = false;
nonePoint = true;
openP = false;
newP = false;
saveP = false;
text.setText("none");
}
}
}
/**
* MyGraphEditor starten
* @param args ignoriert
*/
public static void main(final String[] args){
new MyGraphEditor();
}
}