Почему я не могу рисовать в своем JFrame?

Я пытаюсь рисовать на JFrame, но не могу заставить работать super.paintComponents(g);. Кроме того, на моем JFrame ничего не рисуется, когда я говорю об этом в своем методе paintComponent().

Вот код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class MTGSAMPServerReference extends JFrame implements ActionListener {

    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth());
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight());
    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton next;

    public MTGSAMPServerReference() {
        // set flow layout for the frame
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
        Object[]mainData = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP"};
        JPanel controls = new JPanel(new BorderLayout(5,5));
        list1 = new JList<Object>(mainData);
        list1.setVisibleRowCount(10);
        next = new JButton("Next");
        next.addActionListener(this);
        controls.add(new JScrollPane(list1));
        controls.add(next, BorderLayout.PAGE_END);
        controls.setBorder(new EmptyBorder(25,25,0,0));
        add(controls);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Next")) {
            int index = list1.getSelectedIndex();
            System.out.println("Index Selected: " + index);
            String s = (String) list1.getSelectedValue();
            System.out.println("Value Selected: " + s);
        }
    }

    public void createAndShowGUI() {
        //Create and set up the window.
        JFrame f = new MTGSAMPServerReference();
        //Display the window.
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(1200, 800);
        f.setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        next.setSize(75, 25);
        next.setLocation(251, 276);
        MTGSAMPServerReference.this.repaint();
    }

    protected void paintComponent(Graphics g) {
        //super.paintComponent(g);  <<  Can't seem to get this to work.
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawRect(0, 0, 50, 50);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            MTGSAMPServerReference gui = new MTGSAMPServerReference();
            gui.createAndShowGUI();
            }
        });
    }
}

Я работал с paintComponent() раньше, но до сих пор не могу понять, что я делаю не так. Я знаю, что это должно быть простое решение, но не могу найти его для жизни. Любые идеи?

Любая помощь приветствуется.

Заранее спасибо!


person knorberg    schedule 22.07.2013    source источник


Ответы (2)


Используйте аннотацию @Override в методе paintComponent для грубого сюрприза. Вот почему использование этой аннотации очень полезно, так как она будет помечать вас во время компиляции, если вы не переопределяете метод, когда считаете, что должны это сделать.

Решение: никогда не «рисуйте» в JFrame по многим причинам. Вместо этого делайте то, что вам говорят учебники — рисуйте в JPanel или методе paintComponent(...) JComponent. Если вы выполните поиск по этому сайту, вы обнаружите, что мы говорили здесь многим людям то же самое, и на самом деле я предлагаю вам сделать именно это. Я не удивлюсь, если этот вопрос будет закрыт как дубликат, поскольку это довольно распространенный вопрос.

Обратите внимание, что это не будет "работать" (и на самом деле не будет компилироваться):

super.paintComponent(g);  <<  Can't seem to get this to work.

по той же причине - нет super.paintComponent(g) для JFrame.

Также, относительно,

Я работал с paintComponent() раньше, но до сих пор не могу понять, что я делаю неправильно.

Но если вы посмотрите на свой предыдущий код, вы увидите, что этот метод никогда не использовался непосредственно в JFrame и не должен.

person Hovercraft Full Of Eels    schedule 22.07.2013

paintComponent() является членом класса JPanel, а не класса JFrame, в котором вы пытаетесь его вызвать.

Вот почему вы не можете позвонить super.paintComponent(Graphics g). Компилятор думает, что вы создаете свой собственный, совершенно не связанный с ним метод, который также называется paintComponent().

Создайте класс, который наследует JPanel, и скопируйте и вставьте туда свой метод paintComponent().

Как прокомментировал Hovercraft Full Of Eels, вы можете проверить правильность переопределения методов, добавив тег @Override непосредственно над заголовком метода; если вы получаете сообщение об ошибке, вы делаете что-то не так.

Для получения дополнительной информации о JPanel и JFrame см. мой ответ на этот вопрос .

person scottysseus    schedule 22.07.2013