2

起動/初期化時にアプレット内のJPanelオブジェクトを変更したい。これを行う方法がわかりません。私はJPanelをクリアするという私の問題の簡単な例を作りました。init()メソッドで呼び出された場合は動作しませんが、ボタンを押すと動作します。起動/初期化時にJPanelを変更するにはどうすればよいですか?

import javax.swing.JApplet;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class TestStartUpApplet extends JApplet {

    JPanel panel;   

    @Override
    public void init() {
        System.out.println("Init");
        erasePanel();
    }

    private void erasePanel() {
        Graphics g = panel.getGraphics();
        g.clearRect(0, 0, 117, 48);
    }

    public TestStartUpApplet() {
        getContentPane().setLayout(null);

        panel = new JPanel();
        panel.setBackground(Color.RED);
        panel.setBounds(35, 36, 117, 48);
        getContentPane().add(panel);

        JButton btnTest = new JButton("Test");
        btnTest.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                erasePanel();
            }
        });
        btnTest.setBounds(35, 108, 117, 25);
        getContentPane().add(btnTest);

    }
}
4

4 に答える 4

3

私のためだけに動作します:

public class AppletPaintTest extends JApplet {

    @Override
    public void init() {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {

                setLayout(new BorderLayout());

                ImagePane pane = new ImagePane();
                pane.setBackground(Color.RED);
                pane.setOpaque(false); // Little trick

                add(pane);

            }
        });

    }

    @Override
    public void start() {
        super.start();
    }

    public class ImagePane extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D)g.create();

            Insets insets = getInsets();
            int x = insets.left;
            int y = insets.top;
            int width = getWidth() - 1 - (insets.left + insets.right);
            int height = getHeight() - 2 - (insets.top + insets.bottom);

            g2d.setColor(getBackground());
            g2d.fillRect(x + 10, y + 10, width - 20, height - 20);

            g2d.dispose();

        }

    }

}
于 2012-08-02T21:58:39.040 に答える
2

paint()またはpaintComponent()メソッドへの通常のシステムコール以外でカスタムペイントを行う場合は常に、invalidate()再ペイントするコンポーネントを呼び出す必要があります。したがって、あなたのerasePanel()メソッドでは、フラグを設定してからを呼び出すことをお勧めしますpanel.invalidate()。次に、パネルのpaintComponent()メソッド内で、フラグをチェックして、紹介画像を描画する必要があるかどうか、またはパネルを空白のままにする必要があるかどうかを確認できます。

于 2012-08-02T22:08:11.567 に答える
2

質問

  1. カスタムペイントなしで空のJPanelをクリアしたい理由がわかりません

  2. JPanel赤の何が問題になっていますかBackground

  3. 画面に表示される前にJAppletをクリアします

  4. 何も機能しないため、正しく機能しません

提案

于 2012-08-02T20:48:50.867 に答える
1

わかりました、問題は私のコーディングがちょうど悪かったということだったようです。別のクラスのメソッドでパネルオブジェクトを変更したかったのですが、それはその方法ではありません。コードを書き直して、paintcomponentを使用してペイントを行うパネルクラスを作成しました。このパネルクラスのオブジェクトを使用すると、起動時に必要なグラフィックが表示されます。

助けてくれてありがとう!

于 2012-08-02T22:29:35.707 に答える