Как перерисовать после щелчка мыши в java?

Графика должна перекрашиваться новым цветом после щелчка мыши, но это не так.

Я уже реализовал MouseListener в компоненте и во фрейме, но в обеих версиях он не работал.

Фрейм и MouseListener:

public class frame extends Frame
 {
     public static void main(String[] args)
        {

           JFrame frame = new JFrame();

           String string = new String("1  2  3  4  5  6  7");

           final int FRAME_WIDTH = 527;
           final int FRAME_HEIGHT = 77;

           frame.setAlwaysOnTop(true);
           frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
           frame.setTitle("Praxis");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setUndecorated(true);
           // JFrame zentriert positionieren; selbst berechnet:
           Toolkit tk = Toolkit.getDefaultToolkit();
           Dimension d = tk.getScreenSize();
           frame.setLocation((int) ((d.width)-700), (int) (0));

           Font font = new Font("Jokerman", Font.BOLD, 35);
           JLabel textLabel = new JLabel(string);
           textLabel.setFont(font);

           test component = new test();
           frame.add(component);

           MouseListener listen = new MouseListener()
           {
            public void mouseClicked(MouseEvent e) {
                GlobalVar obj = new GlobalVar();
                obj.fillColor1 = obj.farben[1];
                component.repaint();
            }
            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

            }
            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }
            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }
            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }
           };
           component.addMouseListener(listen);

           frame.setVisible(true);

        }

 }

Файл, из которого они получают цвет:

public class GlobalVar{
    public static final Color[] farben = new Color[4];{ 
        farben[0] = Color.LIGHT_GRAY;
        farben[1] = Color.RED;
        farben[2] = Color.GREEN;
        farben[3] = Color.PINK;
    }
    Color fillColor1 = farben[0];
    Color fillColor2 = farben[0];
    Color fillColor3 = farben[0];
    Color fillColor4 = farben[0];
    Color fillColor5 = farben[0];
    Color fillColor6 = farben[0];
    Color fillColor7 = farben[0];
}

Компонент, который рисует графику:

public class test extends JComponent
 { 
        GlobalVar obj = new GlobalVar();

     @Override
        public void paintComponent(Graphics g)
        {       

          if (g instanceof Graphics2D) {
           // Recover Graphics2D
           Graphics2D g2 = (Graphics2D) g;

           // Construct a rectangle and draw it
           Rectangle box1 = new Rectangle(2, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box1);
           g2.setColor(obj.fillColor1);
           g2.fill(box1);

           Rectangle box2 = new Rectangle(77, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box2);
           g2.setColor(obj.fillColor2);
           g2.fill(box2);

           Rectangle box3 = new Rectangle(152, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box3);
           g2.setColor(obj.fillColor3);
           g2.fill(box3);

           Rectangle box4 = new Rectangle(227, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box4);
           g2.setColor(obj.fillColor4);
           g2.fill(box4);

           Rectangle box5 = new Rectangle(302, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box5);
           g2.setColor(obj.fillColor5);
           g2.fill(box5);

           Rectangle box6 = new Rectangle(377, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box6);
           g2.setColor(obj.fillColor6);
           g2.fill(box6);

           Rectangle box7 = new Rectangle(452, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box7);
           g2.setColor(obj.fillColor7);
           g2.fill(box7);

           g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

           Font f = new Font("Dialog", Font.PLAIN, 30);
           g2.setFont(f);
           g2.setColor(Color.BLACK);
           g2.drawString("1", 30, 48);
           g2.drawString("2", 105, 48);
           g2.drawString("3", 180, 48);
           g2.drawString("4", 255, 48);
           g2.drawString("5", 330, 48);
           g2.drawString("6", 405, 48);
           g2.drawString("7", 480, 48);
          }

        }

        private Color fillColor1;
        private Color fillColor2;
        private Color fillColor3;
        private Color fillColor4;
        private Color fillColor5;
        private Color fillColor6;
        private Color fillColor7;
 }

Как я уже сказал, я ожидал, что графика перерисуется с первым квадратом, который будет заполнен красным цветом, но на самом деле ничего не происходит, когда я нажимаю на рамку.

Просто добавьте MouseListener буквально ко всему. Каждое JFrame и JPanel, которое вы создаете. Затем удалите его из панелей, пока он не перестанет работать, чтобы найти то, что слушатель должен быть включен.

Locke 30.05.2019 19:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо того, чтобы иметь тестовый класс, расширяющий JComponent, я бы превратил его в JPanel, а затем поместил JPanel поверх JFrame.

Затем я удалил бы mouselistener из JFrame и добавил бы его в JPanel, при этом единственная команда, необходимая для перерисовки, — это repaint();. Я считаю, что этот путь проще и организованнее, чем то, что вы сейчас делаете.

Это должно сработать (примечание: я сделал это в netbeans, поэтому есть автоматически сгенерированный код):

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;

public class Test extends javax.swing.JPanel {

    /**
     * Creates new form Test
     */
    public Test() {
        initComponents();
    }
        GlobalVar obj = new GlobalVar();

     @Override
        public void paintComponent(Graphics g)
        {       

          if (g instanceof Graphics2D) {
           // Recover Graphics2D
           Graphics2D g2 = (Graphics2D) g;

           // Construct a rectangle and draw it
           Rectangle box1 = new Rectangle(2, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box1);
           g2.setColor(obj.fillColor1);
           g2.fill(box1);

           Rectangle box2 = new Rectangle(77, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box2);
           g2.setColor(obj.fillColor2);
           g2.fill(box2);

           Rectangle box3 = new Rectangle(152, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box3);
           g2.setColor(obj.fillColor3);
           g2.fill(box3);

           Rectangle box4 = new Rectangle(227, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box4);
           g2.setColor(obj.fillColor4);
           g2.fill(box4);

           Rectangle box5 = new Rectangle(302, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box5);
           g2.setColor(obj.fillColor5);
           g2.fill(box5);

           Rectangle box6 = new Rectangle(377, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box6);
           g2.setColor(obj.fillColor6);
           g2.fill(box6);

           Rectangle box7 = new Rectangle(452, 2, 71, 71);
           g2.setColor(Color.BLACK);
           g2.draw(box7);
           g2.setColor(obj.fillColor7);
           g2.fill(box7);

           g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

           Font f = new Font("Dialog", Font.PLAIN, 30);
           g2.setFont(f);
           g2.setColor(Color.BLACK);
           g2.drawString("1", 30, 48);
           g2.drawString("2", 105, 48);
           g2.drawString("3", 180, 48);
           g2.drawString("4", 255, 48);
           g2.drawString("5", 330, 48);
           g2.drawString("6", 405, 48);
           g2.drawString("7", 480, 48);
          }

        }

        private Color fillColor1;
        private Color fillColor2;
        private Color fillColor3;
        private Color fillColor4;
        private Color fillColor5;
        private Color fillColor6;
        private Color fillColor7;


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate = "collapsed" desc = "Generated Code">                          
    private void initComponents() {

        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                formMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>                        

    private void formMouseClicked(java.awt.event.MouseEvent evt) {                                  
                GlobalVar obj = new GlobalVar();
                obj.fillColor1 = obj.farben[1];
                repaint();
        // TODO add your handling code here:
    }                                 


    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

Другие вопросы по теме