4

に描画しようとして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()以前に働いたことがありますが、私が間違っていることをまだ理解できないようです。簡単な修正でなければならないことはわかっていますが、一生見つけることはできません。何か案は?

ありとあらゆる助けをいただければ幸いです。

前もって感謝します!

4

2 に答える 2

4

@Override失礼なサプライズには、paintComponent メソッドでアノテーションを使用してください。これが、このアノテーションを使用すると非常に役立つ理由です。なぜなら、メソッドをオーバーライドすべきだと思うときにメソッドをオーバーライドしていない場合、コンパイル時にフラグが立てられるからです。

解決策: 多くの理由から、JFrame で「ペイント」しないでください。代わりに、チュートリアルで指示されていることを実行します。つまり、JPanel または JComponent のpaintComponent(...)メソッドをペイントします。このサイトを検索すると、ここにいる多くの人に同じことを伝えていることがわかります。実際、そうするようお勧めします. これはかなり一般的な質問であるため、この質問が重複としてクローズされても驚かないでしょう。

これは「機能しない」ことに注意してください(実際にはコンパイルされません):

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

同じ理由で、JFrameにはありません。super.paintComponent(g)

また、関しては、

以前に paintComponent() を使用したことがありますが、何が間違っているのかまだわかりません。

しかし、以前のコードを見ると、このメソッドが JFrame で直接使用されたことはなく、使用すべきではないことがわかります。

于 2013-07-22T22:51:55.077 に答える
1

paintComponent()JPanelはクラスのメンバーであり、JFrame呼び出そうとしているクラスではありません。

そのため、電話をかけることができませんsuper.paintComponent(Graphics g)。コンパイラは、たまたま呼び出される独自の完全に無関係なメソッドを作成していると考えますpaintComponent()

そこにメソッドを継承JPanelしてコピーして貼り付けるクラスを作成しますpaintComponent()

Hovercraft Full Of Eels のコメントのように@Override、メソッド ヘッダーにタグを直接追加することで、メソッドを正しくオーバーライドしていることを確認できます。エラーが発生した場合は、何か間違ったことをしています。

JPanelとの詳細については、この質問JFrameに対する私の回答を参照してください。

于 2013-07-22T23:01:10.467 に答える