为啥我的 UI 元素在执行 paint(); 后消失了?
Posted
技术标签:
【中文标题】为啥我的 UI 元素在执行 paint(); 后消失了?【英文标题】:Why do my UI elements disappear after executing paint();?为什么我的 UI 元素在执行 paint(); 后消失了? 【发布时间】:2018-10-19 20:10:46 【问题描述】:如果我在没有paint() 方法的情况下运行我的代码,UI 看起来很好,但是在执行paint() 之后,UI 仅在单击/悬停在元素上之后才会出现。
我不知道为什么会发生这种情况,我在某处读到我可能没有以正确的方式调用 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");
我们将不胜感激,提前致谢。
【问题讨论】:
如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。 【参考方案1】:为什么我的 UI 元素在执行 paint() 后消失了?
public void paint (Graphics g)
...
paint() 方法负责绘制所有子组件,但您不调用默认行为。代码应该是:
public void paint (Graphics g)
super.paint(g);
...
但是,这仍然不是正确的解决方案。
你不应该重写paint()!!!
自定义绘画是通过覆盖 JPanel 的 paintComopnent()
来完成的。然后将面板添加到框架中。现在你不会有任何这些问题了。
阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和工作示例。
【讨论】:
以上是关于为啥我的 UI 元素在执行 paint(); 后消失了?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 ko 计算 observable 在其值更改时不会更新绑定的 UI 元素?
为啥我的 Material UI 自动完成元素之一的选项具有蓝色背景,而另一个没有? (包括代码沙箱)