为什么我的 UI 元素在执行 paint(); 后消失了?
Why do my UI elements disappear after executing paint();?
如果我 运行 我的代码没有 paint() 方法,UI 看起来很好,但是在执行 paint() 之后 UI 只在点击 [=26= 之后出现] 在元素之上。
我不知道为什么会这样,我在某处读到我可能没有以正确的方式调用 paint() 方法,或者我的 setVisible() 不正确,但我不确定。
我的主要方法:
public static void main(String[] args) {
frame.createGUI();
if(list != null) {
System.out.println(list.toString());
}else{
System.out.println("Het is niet gelukt om uw stoelen juist in te delen. De zaal zit vol.");
}
}
我的 createGUI 方法:
public void createGUI() {
JScrollPane scrollPane = new JScrollPane();
setPreferredSize(new Dimension(450, 110));
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(scrollPane);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setTitle("Bioscoop Challenge");
JFrame.setDefaultLookAndFeelDecorated(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = this.getContentPane();
window.setLayout(new FlowLayout());
resetButton = new JButton("Reset");
seatAmountField = new JTextField("Seats total");
nField = new JTextField("Seats wanted");
methodButton = new JButton("Reservate");
errorMessage = new JLabel("Error message field");
resetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
list = fillList(seatcount);
frame.validate();
frame.repaint();
}
});
methodButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
list = fillSeats(n, list);
frame.validate();
frame.repaint();
}
});
window.add(resetButton);
window.add(seatAmountField);
window.add(nField);
window.add(methodButton);
window.add(errorMessage);
pack();
validate();
setVisible(true);
}
绘画方法:
public void paint (Graphics g) {
int x = 215;
int y = 200;
int width = 40;
int height = 60;
try {
for (int i = 0; i < list.size(); i++) {
Color color;
Color color2;
if (list.get(i).IsFree()) {
color = red;
color2 = black;
} else {
color = black;
color2 = red;
}
if (list.get(i).booked) {
color = blue;
}
Rectangle r = new Rectangle(x, y, width, height);
g.setColor(color);
g.fillRect(
(int) r.getX(),
(int) r.getY(),
(int) r.getWidth(),
(int) r.getHeight()
);
g.setColor(color2);
g.drawString(list.get(i).seatNumber.toString(), (width + x) - ((width / 2) + (width / 2) / 2), (height + y) - (height / 2));
x = x + 50;
if (x == 1715) {
x = 215;
y = y + 80;
}
}
} catch(Exception e){
errorMessage = new JLabel("ERROR");
}
}
不胜感激,提前致谢。
Why do my UI elements disappear after executing paint()?
public void paint (Graphics g)
{
...
}
paint() 方法负责绘制所有子组件,但您不调用默认行为。代码应该是:
public void paint (Graphics g)
{
super.paint(g);
...
}
然而,这仍然不是正确的解决方案。
你不应该覆盖 paint()!!!
自定义绘画是通过覆盖 paintComopnent()
JPanel 完成的。然后将面板添加到框架中。现在您将不会遇到任何这些问题。
阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。
如果我 运行 我的代码没有 paint() 方法,UI 看起来很好,但是在执行 paint() 之后 UI 只在点击 [=26= 之后出现] 在元素之上。
我不知道为什么会这样,我在某处读到我可能没有以正确的方式调用 paint() 方法,或者我的 setVisible() 不正确,但我不确定。
我的主要方法:
public static void main(String[] args) {
frame.createGUI();
if(list != null) {
System.out.println(list.toString());
}else{
System.out.println("Het is niet gelukt om uw stoelen juist in te delen. De zaal zit vol.");
}
}
我的 createGUI 方法:
public void createGUI() {
JScrollPane scrollPane = new JScrollPane();
setPreferredSize(new Dimension(450, 110));
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
add(scrollPane);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setTitle("Bioscoop Challenge");
JFrame.setDefaultLookAndFeelDecorated(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container window = this.getContentPane();
window.setLayout(new FlowLayout());
resetButton = new JButton("Reset");
seatAmountField = new JTextField("Seats total");
nField = new JTextField("Seats wanted");
methodButton = new JButton("Reservate");
errorMessage = new JLabel("Error message field");
resetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
list = fillList(seatcount);
frame.validate();
frame.repaint();
}
});
methodButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
list = fillSeats(n, list);
frame.validate();
frame.repaint();
}
});
window.add(resetButton);
window.add(seatAmountField);
window.add(nField);
window.add(methodButton);
window.add(errorMessage);
pack();
validate();
setVisible(true);
}
绘画方法:
public void paint (Graphics g) {
int x = 215;
int y = 200;
int width = 40;
int height = 60;
try {
for (int i = 0; i < list.size(); i++) {
Color color;
Color color2;
if (list.get(i).IsFree()) {
color = red;
color2 = black;
} else {
color = black;
color2 = red;
}
if (list.get(i).booked) {
color = blue;
}
Rectangle r = new Rectangle(x, y, width, height);
g.setColor(color);
g.fillRect(
(int) r.getX(),
(int) r.getY(),
(int) r.getWidth(),
(int) r.getHeight()
);
g.setColor(color2);
g.drawString(list.get(i).seatNumber.toString(), (width + x) - ((width / 2) + (width / 2) / 2), (height + y) - (height / 2));
x = x + 50;
if (x == 1715) {
x = 215;
y = y + 80;
}
}
} catch(Exception e){
errorMessage = new JLabel("ERROR");
}
}
不胜感激,提前致谢。
Why do my UI elements disappear after executing paint()?
public void paint (Graphics g)
{
...
}
paint() 方法负责绘制所有子组件,但您不调用默认行为。代码应该是:
public void paint (Graphics g)
{
super.paint(g);
...
}
然而,这仍然不是正确的解决方案。
你不应该覆盖 paint()!!!
自定义绘画是通过覆盖 paintComopnent()
JPanel 完成的。然后将面板添加到框架中。现在您将不会遇到任何这些问题。
阅读有关 Custom Painting 的 Swing 教程部分,了解更多信息和工作示例。