为什么我的 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 教程部分,了解更多信息和工作示例。