为啥我的 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 自动完成元素之一的选项具有蓝色背景,而另一个没有? (包括代码沙箱)

为啥旋转 UIImageView 会影响其他 UI 元素?

我用DrawDib显示图片为啥WM_PAINT会闪烁

为啥在 setContentView() 之后 UI 不加载,而是在 onCreate() 执行之后加载?

为啥 ImageIO 不读取 BMP 文件,直到它被重新保存在 MS Paint 中?