簡體   English   中英

搖擺閃爍

[英]Swing Flickering

我的 Swing 有問題,我正在嘗試做一個日歷,由於我在JPanel放置了一個JLabel並且當我調用函數setText來更改顯示的日期時,顯示的日期顯示圖像閃爍幾毫秒內,所有組件都沒有放在合適的位置,然后一切都顯示良好。

即使當我啟動我的應用程序時,圖像也會閃爍,我注意到每個組件的paintComponent函數都被調用了 3 次......

總之我做了Jpanel稱為Container包含了所有JLabelJtextfield ,我沒有覆蓋其paintComponent調用setBounds 然后我在框架內添加容器並顯示它。

班級抽獎:

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

    }
}

謝謝你的幫助

我找到了我的問題的解決方案。 如果有人遇到與我相同的問題,我將解釋我是如何解決它的,這可能會有所幫助。

首先,如果您想使用 setBounds,請確保已將框架的布局設置為 null,在我的情況下,我創建了一個 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);

        }

}       

如果您想控制框架中的所有內容並設置絕對位置,這種方法很有效。

希望它會有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM