[英]Swing Flickering
我的 Swing 有問題,我正在嘗試做一個日歷,由於我在JPanel
放置了一個JLabel
並且當我調用函數setText
來更改顯示的日期時,顯示的日期顯示圖像閃爍幾毫秒內,所有組件都沒有放在合適的位置,然后一切都顯示良好。
即使當我啟動我的應用程序時,圖像也會閃爍,我注意到每個組件的paintComponent
函數都被調用了 3 次......
總之我做了Jpanel
稱為Container
包含了所有JLabel
和Jtextfield
,我沒有覆蓋其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.