質問

I am trying to draw on my JFrame, but I can't get my super.paintComponents(g); to work. Also, nothing is drawing on my JFrame when I tell it to in my paintComponent() method.

Here is the code:

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();
            }
        });
    }
}

I have worked with paintComponent() before, but still can't seem to figure out what I am doing wrong. I know that it has got to be a simple fix, but can't spot it for the life of me. Any ideas?

Any and all help is appreciated.

Thanks in advance!

役に立ちましたか?

解決

Use the @Override annotation on your paintComponent method for a rude surprise. This is why using this annotation is very helpful, since it will flag you at compile time if you are not overriding a method when you think that you should be.

Solution: never "paint" in a JFrame for many reasons. Instead do what the tutorials tell you to do -- paint in a JPanel or JComponent's paintComponent(...) method. If you search this site you will find that we have told many folks here the same thing, and in fact I suggest that you do just that. I wouldn't be surprised if this question is closed as a duplicate since this is a fairly common question.

Note this won't "work" (and actually won't compile):

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

for the same reason -- there is no super.paintComponent(g) for a JFrame.

Also, regarding,

I have worked with paintComponent() before, but still can't seem to figure out what I am doing wrong.

But if you look at your prior code, you'll see that this method was never used directly in a JFrame, and nor should it.

他のヒント

paintComponent() is a member of the JPanel class, not the JFrame class in which you are trying to call it.

That is why you are unable to call super.paintComponent(Graphics g). The compiler thinks you are creating your own completely unrelated method that also happens to be called paintComponent().

Create a class that inherits JPanel and copy and paster your paintComponent() method there.

Like Hovercraft Full Of Eels commented, you can check that you are correctly overriding methods by adding the @Override tag directly over the method header; if you receive an error, you are doing something wrong.

For more information about JPanel and JFrame, see my answer to this question.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top