3 Stimmen

Wie kann man JFrame nicht neu malen? Einfach malen

Ich brauche Hilfe bei einem einfachen Programm. Ich möchte, dass wenn ich auf Programm klicke, es markiert wird. Ich würde gerne meine Züge in der Vergangenheit sehen. Wie Bleistift in Farbe.

Klasse Test.java

import java.awt.*;
import java.awt.event.*;
import java.util.Scanner;
import java.io.IOException;
import java.lang.*;
import javax.swing.*;

public class Test{

    JFrame frame;

    public static void main(String[] args){
        Test smallTest = new Test();
        smallTest.letsDoIt();
    }

    public void letsDoIt(){
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton buttonOfTheEnd = new JButton("EXIT");
        buttonOfTheEnd.addActionListener(new theEndListener());

        graphPanel panelR = new graphPanel();
        panelR.setBackground(Color.WHITE);
        frame.getContentPane().add(BorderLayout.CENTER, panelR);
        frame.getContentPane().add(BorderLayout.SOUTH, buttonOfTheEnd);
        frame.setSize(500,500);
        frame.setVisible(true);

        frame.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {

                frameMouseClicked(evt);

            }
        });

    }

    void frameMouseClicked(java.awt.event.MouseEvent evt) {

        System.out.println("("+MouseInfo.getPointerInfo().getLocation().x+", "+MouseInfo.getPointerInfo().getLocation().y+")");
        frame.repaint();

    }

    class theEndListener implements ActionListener {
        public void actionPerformed(ActionEvent zdarzenie){
            System.exit(0);
        }
    }

    // public void paintComponent(Graphics g){
        // super.paintComponent(g);
        // int wspX = MouseInfo.getPointerInfo().getLocation().x;
        // int wspY = MouseInfo.getPointerInfo().getLocation().y;

        // g.setColor(Color.RED);
        // g.fillRect( wspX, wspY, 10, 10);

    // 

}

Klasse graphPanel

import java.awt.*;
import javax.swing.*;

class graphPanel extends JPanel{

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        int locX = MouseInfo.getPointerInfo().getLocation().x - 10;
        int locY = MouseInfo.getPointerInfo().getLocation().y - 30;
        g.setColor(Color.ORANGE);
        g.fillRect(locX, locY, 10, 10);
        }
}

danke für die Hilfe.

2voto

oliholz Punkte 7367

Versuchen Sie, auf ein Bild in Ihrem graphPanel und malen das Bild auf die Komponente.
Wenn Sie das Bild nicht löschen, hängen Sie jede Zeichnung an.

class graphPanel extends JPanel{
    Image img;
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        if(img == null) {
            img = new BufferedImage( getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR );
            img.getGraphics().setColor( getBackground() );
            img.getGraphics().fillRect( 0, 0, getWidth(), getHeight() );
        }
        int locX = MouseInfo.getPointerInfo().getLocation().x - 10;
        int locY = MouseInfo.getPointerInfo().getLocation().y - 30;
        Graphics imgG = img.getGraphics();
        imgG.setColor(Color.ORANGE);
        imgG.fillRect(locX, locY, 10, 10);
        g.drawImage( img, 0, 0, this );
    }
}

2voto

Andreas Dolk Punkte 110776

Sie müssen die letzten Standorte irgendwo speichern. A List ist eine gute Wahl. Wenn Sie nun irgendwo auf den Bildschirm klicken, fügen Sie den Ort der Liste hinzu, und wenn Sie den Bildschirm neu malen müssen, malen Sie alle gespeicherten Orte. Das ist etwa so Trennung von Modell und Ansicht (die Modell ist Ihre Liste der 2D-Orte, die siehe ist das, was Sie auf den Bildschirm malen).

Erstellen Sie also irgendwo eine Liste:

// public static only to keep it simple!!
public static List<Point> points = new ArrayList<Point>();

Dann (danke, oliholz!) fügen Sie den Hörer zu panelR anstelle von frame :

panelR.addMouseListener(new MouseAdapter() {
  // ...

und schreiben Sie frameMouseClicked wie:

void frameMouseClicked(MouseEvent evt) {
    points.add(evt.getPoint());
    frame.repaint();
}

Innerhalb paintComponent Sie iterieren durch die Liste und zeichnen alle gespeicherten Orte ein (wieder: sehr einfach und reduziert, verbesserungsfähig!)

g.setColor(Color.ORANGE);
for (Point point:points) {   // <- this is the list of stored points
  g.fillRect(point.x, point.y, 10, 10);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X