canvas in JFrame
Èner
- java
Hallo,
ich arbeite im moment an einem JFrame, dass ein Canvas beinhaltet. Ich habe das "Aussehen" des JFrames mit NetBeans erstellt. Das Programm soll sich die Coordinaten von 3 Punkten merken, und sie im canvas darstellen und mit "A", "B" und "C" beschriften. Ich bin so weit, dass er sich die drei Punkte merkt. Ich bekomm es jedoch nicht hin, etwas in das Canvas zu zeichnen. Hier mein Code:
import java.awt.Graphics;
import java.awt.Color;
/*
* DreieckKreisGUI.java
*
* Created on 19. Juni 2008, 14:1
*
* @author René
*/
public class DreieckKreisGUI extends javax.swing.JFrame {
public int iPoints = 0;
// PointABC[0] is allways Thex-Coordinate - PointABC[1] the y-Coordinate
public int[] PointA = new int[2];
public int[] PointB = new int[2];
public int[] PointC = new int[2];
/** Creates new form DreieckKreisGUI */
public DreieckKreisGUI() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
canvas = new java.awt.Canvas();
jProgressBar1 = new javax.swing.JProgressBar();
jToggleButton1 = new javax.swing.JToggleButton();
jSeparator1 = new javax.swing.JSeparator();
Anweisungen = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextPane1 = new javax.swing.JTextPane();
ProtokollLabel = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
canvas.setBackground(new java.awt.Color(255, 255, 255));
canvas.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
canvasMouseReleased(evt);
}
});
jToggleButton1.setText("| |");
Anweisungen.setText("Anweisungen");
jScrollPane1.setBackground(new java.awt.Color(230, 230, 230));
jScrollPane1.setAutoscrolls(true);
jScrollPane1.setViewportView(jTextPane1);
ProtokollLabel.setText("Protokoll");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(canvas, javax.swing.GroupLayout.PREFERRED_SIZE, 616, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(Anweisungen))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(ProtokollLabel)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 204, Short.MAX_VALUE)
.addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 204, Short.MAX_VALUE)
.addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 204, Short.MAX_VALUE)
.addComponent(jToggleButton1))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(Anweisungen)
.addComponent(ProtokollLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 558, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jToggleButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(canvas, javax.swing.GroupLayout.DEFAULT_SIZE, 640, Short.MAX_VALUE))
.addContainerGap())
);
pack();
}// </editor-fold>
private void canvasMouseReleased(java.awt.event.MouseEvent evt) {
int MouseX = canvas.getMousePosition().x;
int MouseY = canvas.getMousePosition().y;
switch (iPoints) {
case 0:
PointA[0] = MouseX;
PointA[1] = MouseY;
iPoints++;
//hier soll er NUR das Canvas repainten
break;
case 1:
PointB[0] = MouseX;
PointB[1] = MouseY;
iPoints++;
//hier soll er NUR das Canvas repainten
break;
case 2:
PointC[0] = MouseX;
PointC[1] = MouseY;
iPoints++;
Graphics g = null;
canvas.paint(g);
//hier soll er NUR das Canvas repainten
break;
default:
break;
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new DreieckKreisGUI().setVisible(true);
}
});
}
public void start() {
Anweisungen.setText("Klicken Sie auf eine Stelle, um den " + (iPoints+1) + ". Punkt festzulegen.");
}
// Variables declaration - do not modify
private javax.swing.JLabel Anweisungen;
private javax.swing.JLabel ProtokollLabel;
private java.awt.Canvas canvas;
private javax.swing.JProgressBar jProgressBar1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTextPane jTextPane1;
private javax.swing.JToggleButton jToggleButton1;
// End of variables declaration
}
Hallo Èner,
Du machst gleich mehrere Dinge grundlegend falsch.
Um eine eigene Komponente zu schreiben, solltest Du Dich mit der Funktionsweise von Swing etwas beschäftigen. Wenn Du irgend etwas zeichen willst, musst Du eine eigene Komponente schreiben, indem Du bspw. von JComponent ableitest und eine der paint-Methoden überschreibst.
Guter Einstiegspunkt dazu: < http://java.sun.com/docs/books/tutorial/uiswing/painting/index.html>
Du hättest gerne eine Komponente, in die Du etwas "hineinzeichnen" kannst und die das eigentliche Zeichnen dann selber organisiert. So funktionieren GUI-Bibliotheken aber nicht und Swing bietet das auch nicht an. Es gibt zwar auch Bibliotheken, die so etwas können (Eine SVG-Implementierung oder Scenegraph-Bibliotheken), für eine einfache Komponente ist das aber übertrieben. Außerdem solltest Du die Grundlagen erstmal so verstehen.
Der nächste Fehler ist, dass Du AWT-Komponenten (Canvas) und Swing mischst. Das kann man tun und es gibt auch manchmal Gründe dafür, aber normalerweise macht es nur Ärger. Wenn Du nicht weißt, warum Du es tust, lass es bleiben. Eigene Komponenten leitet man wie gesagt von JComponent ab, der Name der Klasse Canvas mag verlockend klingen, aber sie bietet nur eine Basis für AWT-Komponenten.
Letzer Fehler:
Du hast einen Haufen, auch noch automatisch generierten Code gepostet. Versuche so etwas zu vermeiden und zu kürzen, das schreckt ab und wenn ich den Fehler nicht schon beim Stichwort "Canvas" geahnt hätte, hätte ich mich bestimmt nicht weiter darum gekümmert.
Lass Dich nicht entmutigen, im Grunde ist das nicht so kompliziert, man muss nur erstmal verstehen, dass man nicht auf Komponenten zeichnet sondern sich Komponenten selbst zeichnen.
Grüße
Daniel