Wie Sie java aktualisieren Leinwand dynamisch?
Problem: ich bin versucht, zu aktualisieren, die Leinwand mit der neuen Malerei, Objekte, basierend auf Benutzer-Aktion. Die Leinwand dosent aktualisiert.
Was ich getan habe: Der Benutzer interagiert mit dem DnD-action,Die übertragbar Objekt erreicht der Leinwand, Fordert ein update der Grafik-Methode von mir erstellt. Und die Methode verwendet einfach die bereits erstellte Grafiken 2d-Objekt und zeigt die Bilder verwenden.Ich habe checkd die DnD-action,das Objekt richtig recived auf Leinwand-Klasse und ich war in der Lage, drucken Sie Sie aus mit System.aus.println.
Einen Beispiel-code,das hat eine ähnliche Funktion wie das von mir,
Paint Klasse:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class PaintPanel extends JPanel{
private Graphics2D drawImage;
public PaintPanel()
{
}
@Override
public void paint(Graphics g) {
drawImage = (Graphics2D) g;
drawImage.setColor(Color.WHITE);
drawImage.fillRect(0, 0, getWidth(), getHeight());
}
public void updateGraphics(int length,int width)
{
drawImage.setColor(Color.black);
drawImage.drawRect(100, 150, length, width);
repaint();
}
}
mainframe-Klasse:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MainPaint extends JFrame{
public MainPaint()
{
setTitle("test paint");
setSize(400,400);
setLayout(new BorderLayout());
final PaintPanel paintPan = new PaintPanel();
JButton testButon = new JButton("Display shape");
add(paintPan,BorderLayout.CENTER);
add(testButon,BorderLayout.PAGE_END);
testButon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
paintPan.updateGraphics(50,50);
repaint();
}
});
setVisible(true);
}
public static void main(String[] args)
{
new MainPaint();
}
}
- 1) Für besser zu helfen, schneller zu veröffentlichen, SSCCE. 2) würde ich davon abraten über eine AWT-Klasse name für eine benutzerdefinierte Klasse. Es kann führen zu viel Verwirrung. 3) Für
JPanel
diesepublic void paint(Graphics g) {
solltepublic void paintComponent(Graphics g) {
4) Die letzten 3 code-Anweisungen in der aktuellenpaint
- Methode hätte keine Auswirkung. - Ich werde nach einem funktionierenden code so bald wie möglich.Ich dachte, wenn ich poste, was ich getan habe,das könnte helfen, um zu erkennen, die Fehler oder die falsche Herangehensweise, dass ich es hier getan habe.
- Es könnte, aber es ist einfacher/schneller, wenn es eine SSCCE. Auch die Buchung kompilierbare code macht es einfacher zu testen, eine Antwort, so Sie weniger der (höflich Husten) "ich glaube, Sie müssen.." (mögliche Lösungen) und mehr "Sie müssen.." (solutions).
- Ich habe gerade gebucht einen funktionierenden Beispielcode der das Problem.Danke für die Antworten
- "Ich habe gerade gebucht einen funktionierenden Beispiel-code" Huh. Warum würden Sie tun, wenn ich empfohlen, einen SSCCE? Ich werde warten, für die SSCCE.
- was ich geschrieben ist nicht der eigentliche code,sondern nur eine Probe kurz ausführbaren code ,die, die hat das gleiche Problem.
- was ich geschrieben ist nicht der echte code" - Wer fragte nach dem "echten code" um der Barmherzigkeit Willen? Dieser Begriff ist wieder SSCCE. Wenn Sie nicht wissen, was es bedeutet, Folgen Sie dem link und Lesen, anstatt in zufällige blinde Vermutungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie nicht, den cache ein
Graphics
(oderGraphics2D
) Instanz! Stattdessen:repaint()
.paintComponent(Graphics)
ziehen der Liste der Objekte.Eine alternative dazu ist die Verwendung eines
BufferedImage
wie die Zeichnung-Objekt. Sehen diese Antwort für ein Beispiel.Update - SSCCE, basierend auf den aktuellen code.
Hinweis
Gibt es noch eine Reihe von Dinge über Sie, dass code, der geändert werden. Ich beschlossen, zu stoppen frühestens Variante gearbeitet, um anzuzeigen, das Rechteck auf die Schaltfläche klicken.
Ich glaube, Sie müssen rufen Sie die
validate()
Methode.JPanel
oderJLabel
), in der Erwägung, dass dies scheint zu sein, völlig custom-painting.