Свинг мерцание - PullRequest
       16

Свинг мерцание

0 голосов
/ 02 июля 2019

У меня проблема с Swing, я пытаюсь сделать календарь, и дата отображается благодаря JLabel, который я вставил в JPanel, и когда я вызываю функцию setText дляизмените отображаемую дату, изображение мерцает в течение нескольких миллисекунд, все компоненты находятся не в хорошем месте, а затем все отображается хорошо.

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

Подводя итог, я сделал Jpanel с именем Container, который содержит все JLabel и Jtextfield, я переопределил их paintComponent для вызова setBounds,А затем я добавляю контейнер внутрь фрейма и отображаю его.

Класс draw:

package gui;

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

public class draw {
    JTextField B3;
    JTextField C3;
    JTextField D3;
    JTextField E3;
    JTextField F3;
    JTextField B4;
    JTextField C4;
    JTextField D4;
    JTextField E4;
    JTextField F4;
    JTextField B5;
    JTextField C5;
    JTextField D5;
    JTextField E5;
    JTextField F5;
    JTextField B6;
    JTextField C6;
    JTextField D6;
    JTextField E6;
    JTextField F6;
    JTextField B7;
    JTextField C7;
    JTextField D7;
    JTextField E7;
    JTextField F7;
    JTextField B8;
    JTextField C8;
    JTextField D8;
    JTextField E8;
    JTextField F8;

    public draw(){}
    public void drawCalendar() {
        B3 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(470, 170, 200, 30);

                super.paintComponent(g);
            }

        };
        C3 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(670, 170, 200, 30);

                super.paintComponent(g);
            }
        };
        D3 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                System.out.println("IL MA REPAIT !");
                this.setBounds(870, 170, 200, 30);

                super.paintComponent(g);
            }
        };
        E3 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1070, 170, 200, 30);

                super.paintComponent(g);
            }
        };
        F3 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1270, 170, 200, 30);

                super.paintComponent(g);
            }
        };
        B4 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(470, 200, 200, 30);

                super.paintComponent(g);
            }
        };
        C4 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(670, 200, 200, 30);

                super.paintComponent(g);
            }
        };
        D4 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(870, 200, 200, 30);

                super.paintComponent(g);
            }
        };
        E4 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1070, 200, 200, 30);

                super.paintComponent(g);
            }
        };
        F4 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1270, 200, 200, 30);

                super.paintComponent(g);
            }
        };

        B5 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(470, 230, 200, 30);

                super.paintComponent(g);
            }
        };
        C5 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(670, 230, 200, 30);

                super.paintComponent(g);
            }
        };
        D5 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(870, 230, 200, 30);

                super.paintComponent(g);
            }
        };
        E5 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1070, 230, 200, 30);

                super.paintComponent(g);
            }
        };
        F5 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1270, 230, 200, 30);

                super.paintComponent(g);
            }
        };
        B6 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(470, 260, 200, 30);

                super.paintComponent(g);
            }
        };
        C6 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(670, 260, 200, 30);

                super.paintComponent(g);
            }
        };
        D6 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(870, 260, 200, 30);

                super.paintComponent(g);
            }
        };
        E6 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1070, 260, 200, 30);

                super.paintComponent(g);
            }
        };
        F6 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1270, 260, 200, 30);

                super.paintComponent(g);
            }
        };
        B7 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(470, 350, 200, 30);

                super.paintComponent(g);
            }
        };
        C7 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(670, 350, 200, 30);

                super.paintComponent(g);
            }
        };
        D7 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(870, 350, 200, 30);

                super.paintComponent(g);
            }
        };
        E7 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1070, 350, 200, 30);

                super.paintComponent(g);
            }
        };
        F7 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1270, 350, 200, 30);

                super.paintComponent(g);
            }
        };
        B8 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(470, 380, 200, 30);

                super.paintComponent(g);
            }
        };
        C8 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(670, 380, 200, 30);

                super.paintComponent(g);
            }
        };
        D8 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(870, 380, 200, 30);

                super.paintComponent(g);
            }
        };
        E8 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1070, 380, 200, 30);

                super.paintComponent(g);
            }
        };
        F8 = new JTextField(15) {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(1270, 380, 200, 30);

                super.paintComponent(g);
            }
        };

Пример класса

public class example {
    int weeknumber = 0;
    String month = "June";
    JLabel A1;
    public void updateLabelText(){
        weeknumber++;
        A1.setText("<html>week" + weeknumber + "<br>" + "<center>" + month + "</html>");

    }

    public example(){
        JFrame frame = new JFrame("Planning");
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setResizable(false);
        frame.setPreferredSize(new Dimension((int) dimension.getWidth() - 50, (int) dimension.getHeight() - 50));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Integer weeknumber = 23;

        draw draw = new draw();
        draw.drawCalendar();

         A1 = new JLabel("<html>week " + weeknumber + "<br>" + "<center>" + month + "</html>") {
            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds(70, 40, 400, 100);
                this.setHorizontalAlignment(SwingConstants.CENTER);




                g.setColor(Color.BLUE);

                g.fillRect(0, 25, 400, 60);
                g.setColor(Color.BLACK);
                g.drawRect(0, 25, 400, 60);
                super.paintComponent(g);


            }
        };
        JPanel Container = new JPanel();
        Container.setBounds(0, 0, (int) dimension.getWidth(), (int) dimension.getWidth());
        Container.add(A1);

        JButton next_week = new JButton("Suivante") {


            @Override
            protected void paintComponent(Graphics g) {
                this.setBounds((int) dimension.getWidth() / 2 + 70, 10, 150, 50);

                super.paintComponent(g);

            }
        };
        next_week.addActionListener(e -> {
            updateLabelText();

        });
        Container.add(next_week);
        Container.add(draw.B6);
        Container.add(draw.C6);
        Container.add(draw.D6);
        Container.add(draw.E6);
        Container.add(draw.F6);
        Container.add(draw.C7);
        Container.add(draw.D7);
        Container.add(draw.E7);
        Container.add(draw.F7);
        Container.add(draw.B8);
        Container.add(draw.C8);
        Container.add(draw.D8);
        Container.add(draw.E8);
        Container.add(draw.F8);
        frame.add(Container);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        example example = new example();

    }
}

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 04 июля 2019

Я нашел решение своей проблемы.Я собираюсь объяснить, как я решил это, если кто-то сталкивается с той же проблемой, что и я, это может помочь.

Прежде всего, если вы хотите использовать setBounds, убедитесь, что вы установили макет фрейма как нулевой и вВ моем случае я создал JPanel, где я добавляю все свои компоненты, поэтому я устанавливаю для его макета значение null.

JPanel Container = new JPanel();
JFrame frame = new JFrame("Name of your APP");
Container.setLayout(null);
frame.setLayout(null);

Затем напишите класс, расширяющий компонент, который вы хотите использовать, поэтому в моем случае я написал следующие классы

class label extends JLabel{
        int x;
        int y;
        int width;
        int height;
        public label(String text,int x, int y, int width, int height) {
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
            this.setText(text);
            this.setBounds(x, y, width,height);
            this.setHorizontalAlignment(SwingConstants.CENTER);

        }
}


class button extends JButton{
        public button(String text,int x, int y,int width,int height){
            this.setText(text);
            this.setBounds(x, y, width, height);

        }


} 
class textField extends JTextField{

        public textField(int col,int x,int y ,int width,int height){
            this.setBounds(x, y, width,height);
            this.setColumns(col);

        }

}       

Этот способ хорошо работает, если вы хотите контролировать все в кадре и устанавливать абсолютную позицию.

Надеюсь, это поможет:)

...