1

良い一日、

うまくいけば、これは簡単な質問です。JFrame 内で JPanels と JLayeredPane を使用するアプリケーションを作成しています。アプリケーションの最初の起動時に、パネルがあるはずの領域にマウスを移動するまで、パネルの 1 つが表示されません。検証メソッドと再描画メソッドも呼び出しますが、両方のパネルを一緒に表示できます。助言がありますか?ありがとうございました。

これが私のJFrameクラスです(メインメソッドがあります)

import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;


public class Application extends JFrame
{
    public Application()
    {   
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        JLayeredPane lp = new JLayeredPane();
        lp.setBounds(0,0,500,500);
        this.setLayeredPane(lp);

        Mypanel p1 = new Mypanel();
        Mypanel2 p2 = new Mypanel2();

        this.getLayeredPane().add(p1,0);
        this.getLayeredPane().add(p2,1);

        this.validate();
        this.repaint();
        this.validate();
    }


    public static void main(String[] args)
    {
        Application app = new Application();

    }
}

これが私のパネルクラスの1つです

import javax.swing.JButton;
import javax.swing.JPanel;

public class Mypanel extends JPanel
{
    public JButton button;

    public Mypanel()
    {
        this.setLayout(null);
        this.setBounds(0, 0, 500, 500);
        JButton b = new JButton("Hello");
        b.setBounds(20,20,300,300);
        this.add(b);
    }
}

そして最後に、最後のパネル クラス

import javax.swing.JButton;
import javax.swing.JPanel;


public class Mypanel2 extends JPanel
{
    public JButton button;

    public Mypanel2()
    {
        this.setLayout(null);
        this.setBounds(0, 0, 500, 500);
        JButton b = new JButton("SUP");
        b.setBounds(20,10,200,200);
        this.add(b);
        this.repaint();
        this.validate();
        this.repaint();
    }
}
4

2 に答える 2

1

まず、有効なプログラムでは、JComponent自分自身を再描画するだけです。ある時点でc.repaint()、コントローラー コードから呼び出すことで何らかの問題が解決することに気付いた場合は、swing フレームワークの中核にある基本的な契約を無視しています。そして、これは決して良い考えではありません。したがって、これらrepaintvalidate呼び出しをすべて削除することは、良い出発点です。次に重要なことは、軽量の swing コンポーネントがどのように子を描画するかを理解することです。最適化と非最適化の 2 つのモードがあります。最初のものは、コンテナ内で兄弟が互いに重なっていない場合にのみ適用されます。それらがあり、最適化された描画がオンになっている場合、それらのコンポーネントが再描画されたときに、あらゆる種類の奇妙な動作が発生します (それらの上にマウスポインターを置いたときなど)。すべての軽量コンポーネントは、オーバーラップする子を次の方法で処理できます。setComponentZOrder(). JLayeredPane は、より柔軟な方法で zorder を制御する手段としてレイヤーの概念を導入するだけです。子を描画するためにどのモードを選択するかについて賢くしようとしますが、悲しいことに、これがどのように機能するかには微妙な点があります。したがって、このコードは必要なことを行います:

Mypanel p1 = new Mypanel();
Mypanel2 p2 = new Mypanel2();

getLayeredPane().setLayer(p1,0);
getLayeredPane().setLayer(p2,1);

getLayeredPane().add(p1);
getLayeredPane().add(p2);

これはそうではありません:

Mypanel p1 = new Mypanel();
Mypanel2 p2 = new Mypanel2();

getLayeredPane().add(p1);
getLayeredPane().add(p2);

getLayeredPane().setLayer(p1,0);
getLayeredPane().setLayer(p2,1);

トリックはsetLayer、JLayeredPane が最適化された描画をオフにするように、子をコンテナーに追加する前に呼び出すことです。

ところで、なぜだろうと思わずにはいられませんでした JLayeredPane。異なるレイアウトをプログラムで切り替える必要がある場合は、おそらく JTabbedPane が答えです

于 2012-06-25T21:48:15.077 に答える
0
JLayeredPane lp = new JLayeredPane();
JPanel d = new JPanel();
d.setVisible(true);
d.setBounds(10, 10, 556, 386);
lp.add(d, new Integer(0), 0);
于 2013-03-19T18:24:19.170 に答える