java - 摇摆闪烁
问题描述
我对 Swing 有问题,我正在尝试做一个日历,并且由于JLabel
我放入了 aJPanel
而显示日期,当我调用函数setText
来更改显示的日期时,图像会闪烁几毫秒组件不在好位置,然后一切都显示良好。
即使当我启动我的应用程序时,图像也会闪烁,我注意到每个组件的paintComponent
函数都被调用了 3 次......
总而言之,我做了一个包含所有and的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);
}
}
如果您想控制框架中的所有内容并设置绝对位置,这种方式效果很好。
希望它会有所帮助:)
推荐阅读
- python - 在 python 中安装 Pandas 时出现“IndexError: list index out of range”
- listview - 列出小部件但不加载它们
- mysql - 根据到坐标的距离加快 mySQL SPATIAL 选择
- python - 如何在 Django 模板中列出 wagtail 页面?
- reactjs - 反应打字稿-','预期.ts(1005)
- python - 密码破解
- mysql - 用于变量重叠的递归 MySQL 查询
- python-2.7 - serving_input_receiver_fn() function without the deprecated tf.placeholder method in TF 2.0
- spring-boot - WebClient ExchangeFilterFunction unable to add header java.lang.UnsupportedOperationException ReadOnlyHttpHeaders
- python - 从 Django 中的 mongodb Datetime 文件和 Group_by 中提取月份和年份