Почему мои элементы пользовательского интерфейса исчезают после выполнения paint () ;? - PullRequest
0 голосов
/ 09 мая 2018

Если я запускаю свой код без метода paint (), пользовательский интерфейс выглядит нормально, но после выполнения paint () пользовательский интерфейс появляется только после нажатия / наведения курсора на элементы.

Я не знаю, почему это происходит, я где-то читал, что я не могу правильно вызывать метод 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");
    }
}

Помощь будет оценена, заранее спасибо.

1 Ответ

0 голосов
/ 09 мая 2018

Почему мои элементы пользовательского интерфейса исчезают после выполнения paint ()?

public void paint (Graphics g) 
{
    ...
}

Метод paint () отвечает за рисование всех дочерних компонентов, но вы не вызываете поведение по умолчанию. Код должен быть:

public void paint (Graphics g) 
{
    super.paint(g);
    ...
}

Однако, это все еще не правильное решение.

Вы НЕ должны переопределять краски () !!!

Выборочная окраска выполняется путем переопределения paintComopnent() JPanel. Затем вы добавляете панель в рамку. Теперь у вас не будет ни одной из этих проблем.

Прочтите раздел из учебника по Swing по Custom Painting для получения дополнительной информации и рабочих примеров.

...