0

最初に空の JTabbedPane オブジェクトを作成し、次に 2 つの JPanel を後で追加して、非常に単純な JTabbedPane を作成しました。各 JPanel は、JButton を拡張し、MouseListener を実装するオブジェクトを保持しています。これらはそれぞれ、ファイルからロードされた異なるイメージを保持します。画像は、バッファリングされた画像や画像アイコンなどとしてローカルに保持されますが、これらはすべてうまく機能します. すべてを保持する JFrame 内で、パネルのサイズが変更されたり、JTabbedPane のサイズが変更されたりするため、(getscaledinstance() を使用して) ボタンのサイズが変更されたときに画像のサイズを変更できるようにすることがすべてのポイントです。JButton を拡張するクラスでこれを実現するために、paintComponent() をオーバーライドします。私はMigLayout Managerを使用していますが、レイアウトの制約、成長、塗りつぶし、初期サイズ、優先サイズなどを制御するすべてがうまくいきます.

2 日前までは、すべてがかなりうまく機能していました。MigLayout マネージャーを手に入れたときに、サイズ変更の問題を微調整しようとして、いくつかの変更を加えました。当時、私は、レイアウト マネージャーではなく、コンポーネントによって提供されるメソッドを使用して、さまざまな最小、最大、および優先サイズを設定して遊んでいました。また、pack()、validate()、visible()、opaque() などで少しだまされました。はい、ここで Swing と AWT の描画に関する記事を読みました: http://java.sun.com/products/jfc /tsc/articles/painting/ に移行し、MigLayout にますます依存するようになりました。無関係なことですが、JFrame は maxsize を尊重していないようです。

どういうわけか、今日、swing によって提供されるこれらのメソッドのいずれかを使用して、または使用せずに、代わりに MigLayout マネージャーを使用してこれらの問題の一部を処理して、追加した最初の JPanel を正しく表示する JTabbedPane ができましたが、2 番目の JPanel ではありません- -タブとして表示されますが、選択すると表示されません。最初に追加するパネルの順序を変更しましたが、これは最初に追加した JPanel に関係なく当てはまり、JPanel は問題なく、問題は JTabbedPane にある可能性が最も高いと言えます。2 番目のタブをクリックすると、JTabbedPane が切り替わりますが、JPanel に空白のボタンのように見えるものがあります。いくつかのコンソール システムアウト ステートメントは、次のことを示しています。その時点では存在しなかったかのように。c) 2 番目のタブに切り替えると、その 2 番目の JPanel 内のボタンのオーバーライドされた paintComponent() メソッドが呼び出されることはありません。そのため、ボタンが存在するタブが表示されているにもかかわらず、実際にはペイントされません。d) JTabbpedPane getComponentCount() は、2 番目のパネルを追加した後、正しい値 2 を返します。e) MigLayout マネージャーは実際にはうまく機能しますが、余談ですが...

古いコードに戻すことはできません。これを引き起こした変更を元に戻そうと最善を尽くしても、新しい問題を修正することはできません。最も重要な呼び出し以外はすべてコメントアウトしました。MigLayout に適した文字列引数を使用してパネルにボタンを配置するための add(); MigLayout 文字列引数を使用して JTabbedPane にパネルを配置するための add(); JFrame のクローズ時のデフォルト op を設定します。JFrameを可視に設定します。これは、最適化設定、ダブル バッファリング設定、不透明設定をいじらず、デフォルトのままにして、修正しないことを意味します。2 番目のパネル自体は表示されません。追加する必要がある各パネルは、最初に読み込まれるときに正常に動作し、パネルとボタン自体が正常であることを再確認します。

これが私がやっていることの一部です:

//Note: BuildaButton is a class that merely constructs my instances
File f = new File("/foo.jpg");
button1 = new BuildaButton().BuildaButton(f).buildfoo1Button();

f = new File("/foo2.jpg");
button2 = new BuildaButton().BuildaButton(f).buildfoo2Button();

MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(ml);
foo2panel.add(button2, "w 186:752:, h 200:807:");



tabs.add("foo1", foo1panel);
tabs.add("foo2", foo2panel);
System.out.println("contents of tabs: " + tabs.getComponentCount() + " elements");
mainframe.setLayout(ml2);
mainframe.setMinimumSize(new Dimension(850,800));
mainframe.add(tabs, "w 600:800:, h 780:780:");
//controlpanel is a still blank jpanel that holds nothing--it is a space holder for now & will be utilized
mainframe.add(controlpanel, "w 200:200:200, h 780:780:");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.setVisible(true);

どうぞよろしくお願いいたします。

4

1 に答える 1

2

異なるパネルで同じレイアウト インスタンスを使用することはできません。ml とまったく同じレイアウトの 2 番目のインスタンスを作成し、それを 2 番目のパネルに設定します。

...
MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout mla = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

BorderLayout test = new BorderLayout(5,5);

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(mla);
foo2panel.add(button2, "w 186:752:, h 200:807:");
...
于 2011-01-09T09:03:17.890 に答える