Hi,
ich stehe vor dem Problem, daß ich in ein JPane zeichnen möchte, welches sich mit anderen Komponenten in einem Frame befindet. Das zeichnen klappt soweit, nur soll, falls ich über das Fenster hinauszeichne eine ScrollBar angezeigt werden. Bis jetzt muß ich das Fenster per Hand vergrößern, um Zeichnungen zu sehen, die über die ursprüngliche Fenstergröße hinausgehen. Das erscheinen der ScrollBars klappt auch (irgendwie) aber mein Problem ist, daß sich das Programm alles andere als so verhält, wie es soll. Beim starten ist außer dem Rahmen nichts zu sehen, sondern die Desktopelemente im Hintergrund, wenn ich anfange zu zeichnen sehe ich zwar die Linien, aber die Hintergrundfarbe spielt verrückt und wechselt von schwarz nach grau usw.
Ich habe verschiedenes im Internet zu dem Thema gelesen und nach meinem aktuellen Wissensstand gehe ich wie folgt vor:
Ein Panel nimmt ein ScrollPane auf, welches wiederum ein JPanel aufnimmt, in dem die Elemente gezeichnet werden. Nachdem ein zu zeichnendes Element hinzugefügt wurde, wird die Dimension des Panels überprüft und angepaßt.
Das Programm selber dient momentan nur dazu, anhand von mousePressed und mouseDragged Linien zu zeichnen. Die Linien werden in eine Liste aufgenommen und nach jeder Aktion mit der Maus an das Pane innerhalb des ScrollPane zum zeichnen übergeben.
Das Panel, das ein ScrollPane aufnimmt und auf Mausereignisse reagiert:
Das Panel, das sich innerhalb des ScrollPane befindet und die Elemente zeichnet:
Und zuguterletzt der Frame, der zur Anzeige der Komponenten dient:
Ich hoffe, ich habe das ganze ausreichend beschrieben, so daß die Logik des Codes einigermaßen rüberkommen und mir jemand sagen kann, wo der Wurm steckt.
Viele Grüße,
Minos
ich stehe vor dem Problem, daß ich in ein JPane zeichnen möchte, welches sich mit anderen Komponenten in einem Frame befindet. Das zeichnen klappt soweit, nur soll, falls ich über das Fenster hinauszeichne eine ScrollBar angezeigt werden. Bis jetzt muß ich das Fenster per Hand vergrößern, um Zeichnungen zu sehen, die über die ursprüngliche Fenstergröße hinausgehen. Das erscheinen der ScrollBars klappt auch (irgendwie) aber mein Problem ist, daß sich das Programm alles andere als so verhält, wie es soll. Beim starten ist außer dem Rahmen nichts zu sehen, sondern die Desktopelemente im Hintergrund, wenn ich anfange zu zeichnen sehe ich zwar die Linien, aber die Hintergrundfarbe spielt verrückt und wechselt von schwarz nach grau usw.
Ich habe verschiedenes im Internet zu dem Thema gelesen und nach meinem aktuellen Wissensstand gehe ich wie folgt vor:
Ein Panel nimmt ein ScrollPane auf, welches wiederum ein JPanel aufnimmt, in dem die Elemente gezeichnet werden. Nachdem ein zu zeichnendes Element hinzugefügt wurde, wird die Dimension des Panels überprüft und angepaßt.
Das Programm selber dient momentan nur dazu, anhand von mousePressed und mouseDragged Linien zu zeichnen. Die Linien werden in eine Liste aufgenommen und nach jeder Aktion mit der Maus an das Pane innerhalb des ScrollPane zum zeichnen übergeben.
Das Panel, das ein ScrollPane aufnimmt und auf Mausereignisse reagiert:
Code:
import java.awt.RenderingHints.Key;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.text.AttributedCharacterIterator;
import javax.naming.LinkLoopException;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
public class DrawComponent extends JPanel implements MouseListener, MouseMotionListener {
private int x1;
private int x2;
private int y1;
private int y2;
private java.util.List<int[]> lines = new LinkedList<int[]>();
private DrawingPane drawingPane;
private JScrollPane scroller;
public DrawComponent() {
this.setLayout(new BorderLayout());//super(new BorderLayout());
drawingPane = new DrawingPane();
drawingPane.addMouseListener(this);
drawingPane.addMouseMotionListener(this);
scroller = new JScrollPane(drawingPane);
scroller.setPreferredSize(this.getSize());
add(scroller, BorderLayout.CENTER);
}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
x2 = e.getX();
y2 = e.getY();
int[] coords = {x1,y1,x2,y2};
lines.add(coords);
}
public void mouseReleased(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {
lines.remove(lines.size()-1);
int[] coords = {x1, y2, e.getX(), e.getY()};
lines.add(coords);
drawingPane.drawLines(lines);
drawingPane.setPreferredSize(drawingPane.getSize());
drawingPane.revalidate();
drawingPane.repaint();
}
public void mouseMoved(MouseEvent e) {
}
public void removeLast() {}
public void selectComponent() {}
}
Das Panel, das sich innerhalb des ScrollPane befindet und die Elemente zeichnet:
Code:
import javax.swing.JPanel;
import java.awt.*;
import java.util.*;
public class DrawingPane extends JPanel {
private java.util.List<int[]> lines;
public DrawingPane() {
this.setBackground(new Color(0,0,0,50));
}
public void drawLines(java.util.List lines) {
this.lines = lines;
}
public Dimension getArea() {
int minX = 0;
int minY = 0;
int width = 0;
int height = 0;
for(Iterator i = lines.iterator(); i.hasNext();) {
int[] coords = (int[])i.next();
if(coords[0] > width)
width = coords[0];
if(coords[2] > width)
width = coords[2];
if(coords[1] > height)
height = coords[1];
if(coords[3] > width)
height = coords[3];
}
return new Dimension(width, height);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for(Iterator i = lines.iterator(); i.hasNext();) {
int[] coords = (int[])i.next();
g.drawLine(coords[0], coords[1], coords[2], coords[3]);
}
}
}
Und zuguterletzt der Frame, der zur Anzeige der Komponenten dient:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JScrollPane;
public class Gui extends javax.swing.JFrame {
private Point p;
private DrawComponent drawComponent;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
/** Creates new form Gui */
public Gui() {
initComponents();
this.setSize(800, 600);
drawComponent = new DrawComponent();
this.add(drawComponent, java.awt.BorderLayout.CENTER);
}
private void initComponents() {
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jMenu1.setText("Menu");
jMenuBar1.add(jMenu1);
setJMenuBar(jMenuBar1);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Gui().setVisible(true);
}
});
}
}
Ich hoffe, ich habe das ganze ausreichend beschrieben, so daß die Logik des Codes einigermaßen rüberkommen und mir jemand sagen kann, wo der Wurm steckt.
Viele Grüße,
Minos