0

それは簡単な質問です。おそらく、私が読んでいるチュートリアルを理解していないだけです。しかし、私はしばらくこれにこだわっています。私のプログラムは、"hello world" 以外はとてもシンプルです。私がやろうとしているのはこれです: ユーザーがボタンをクリックすると、「O」が右に移動します。簡単ですが、repaint() をどこに置くのでしょうか? 何かを追加する必要がありますか.repaint(); 画面を再描画するか、それとも単独で?ネストされたクラスの問題?T_Tこれは私を惨めにしています。私が理解できないこの問題を誰も抱えていないようです. 前もって感謝します。

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

public class GuiTest {

    static int x = 20;

    private static class moveTest extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString("O", x, 30);
        }
    }

    private static class ButtonHandler implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            x += 1;
        }
    }

    public static void main(String[] args) {
        moveTest displayPanel = new moveTest();
        JButton okButton = new JButton("move");
        ButtonHandler listener = new ButtonHandler();
        okButton.addActionListener(listener);

        JPanel content = new JPanel();
        content.setLayout(new BorderLayout());
        content.add(displayPanel, BorderLayout.CENTER);
        content.add(okButton, BorderLayout.SOUTH);

        JFrame window = new JFrame("GUI Test");
        window.setContentPane(content);
        window.setSize(250, 100);
        window.setLocation(100, 100);
        window.setVisible(true);
    }
}
4

2 に答える 2

2

呼び出すコンポーネントが必要ですrepaint()。最も簡単な解決策は、次のように呼び出すrepaint()ことです。

((JComponent)e.getSource()).getTopLevelAncestor().repaint();

問題は、あなたActionListenerが静的メンバー クラスとして宣言されているため、外側のクラスのインスタンスに関連付けられていないため、外側のクラスの非静的メンバーにアクセスできないことです。通常、私はすべての GUI 初期化コードを独自のJPanelサブクラスのコンストラクター内に配置します。リスナーには匿名の内部クラスも使用します。静的でない限り、名前付きクラスを簡単に使用できます。次に、リスナー メソッド内で JPanel メソッドを呼び出すことができます。

于 2013-07-07T14:39:42.757 に答える