Как не перекрасить JFrame? Просто рисовать - PullRequest
3 голосов
/ 09 сентября 2011

Мне нужна помощь с простой программой. Я хотел бы, когда я нажимаю программу отмечает это. Я хотел бы видеть, что мои шаги сделали в прошлом. Как карандаш в краске.

класс 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);

    // 




}

класс графических панелей

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);
        }
}

спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Вы должны где-то хранить последние местоположения.A List - хороший выбор.Теперь, когда вы щелкаете где-то на экране, вы добавляете местоположение в список, а когда вам нужно перекрасить экран, вы рисуете все сохраненные места.Это что-то вроде разделения модели и вида ( модель - это ваш список 2D-местоположений, вид - это то, что вы рисуете на экране).

Создайте где-нибудь один список:

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

Затем (спасибо, oliholz!) Добавьте слушателя в panelR вместо frame:

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

и напишите frameMouseClicked как:

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

Внутри paintComponent вы перебираете список и рисуете все сохраненные местоположения (опять же: очень просто и сокращено, улучшаемо!)

g.setColor(Color.ORANGE);
for (Point point:points) {   // <- this is the list of stored points
  g.fillRect(point.x, point.y, 10, 10);
}
2 голосов
/ 09 сентября 2011

Попробуйте нарисовать изображение на вашем graphPanel изображении на компоненте.
Если вы не очищаете изображение, вы прикрепляете каждый рисунок.

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 );
    }
}
...