2017-08-21 19 views
1

基本的に私はJavaでスレッドを理解しようとしています。私は、外部クラスから2つのJPanelを含むメインのJFrameクラスを作成し、それは2番目のパネルからのメッセージです。それまで私は最初の外部パネルを作成しただけで、そこに問題が始まりました! 「ロードされた」ように見えるが、それは。だからここ がメインクラスです(のSystem.outラインを参照)が正しく表示されません外部JPanelクラスは、メインJFrameクラスで正しく表示されません

package com.maybee.gui; 

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.LineBorder; 

public class Maybee extends JFrame implements Runnable 
{ 
public JFrame maynFrame = null; 
public JPanel contentPanel = null; 
public SimPanel simPanel = null; 

public int screenWidth = 0; 
public int screenHeight = 0; 

public Maybee() 
{ 

} 


private void init() 
{ 
    System.out.println("In Inint"); 
    maynFrame = new JFrame("Maybee"); 
    maynFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
    screenWidth = gd.getDisplayMode().getWidth(); 
    screenHeight = gd.getDisplayMode().getHeight(); 
    maynFrame.setPreferredSize(new Dimension(screenWidth,screenHeight - 100)); 
    maynFrame.setContentPane(getContentPanel()); 
    maynFrame.setVisible(true); 
    maynFrame.pack(); 
} 

public JPanel getContentPanel() 
{ 
    if (contentPanel == null) 
    { 
     contentPanel = new JPanel(); 
     contentPanel.setPreferredSize(new Dimension(screenWidth,screenHeight - 100)); 
     contentPanel.setBorder(new LineBorder(Color.BLUE)); 
     contentPanel.setBackground(Color.RED); 
     contentPanel.setLayout(new BorderLayout()); 
     contentPanel.add(getSimPanel(),BorderLayout.CENTER); 

    } 

    return contentPanel; 
} 

public SimPanel getSimPanel() 
{ 
    if(simPanel == null) 
    { 
     simPanel = new SimPanel(this); 

    } 
    return simPanel; 
} 


public static void main(String[] args) 
{ 

    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      System.out.println("Start"); 
      Maybee maybee = new Maybee(); 
      maybee.run(); 

     } 

    }); 
} 

public void run() 
{ 
    init(); 

} 

}今

第一の外部のJPanelクラス

package com.maybee.gui; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

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

public class SimPanel extends JPanel 
{ 
    public Maybee localMaybee = null; 
    public JPanel simPanel = null; 
    private JButton btn; 

    public SimPanel(Maybee interMaybee) 
    { 
    localMaybee = interMaybee; 
    init(); 
    } 

    public void init() 
    { 
    simPanel = new JPanel(); 
    simPanel.setLayout(new BorderLayout()); 
    simPanel.setPreferredSize(new Dimension(localMaybee.screenWidth/4,localMaybee.screenHeight - 100)); 
    simPanel.setBackground(Color.GREEN); 
    simPanel.add(getBtn(),BorderLayout.CENTER); 
    simPanel.setVisible(true); 

    System.out.println("IN SIM" + localMaybee.screenWidth); 
} 

public JButton getBtn() 
{ 
    if(btn == null) 
    { 
     btn = new JButton("ENDE"); 
     btn.setSize(70, 20); 
     btn.setForeground(Color.YELLOW); 
     btn.addActionListener(new ActionListener() 
     { 

      @Override 
      public void actionPerformed(ActionEvent e) 
      { 


      } 
     }); 

    } 
    return btn; 
} 
} 

私は何が欠けていますか?

多くの感謝!

+2

は、それらの瞬間をテストすることはできませんが:1)( 'パックを呼び出し);' 'のsetVisible(true)を前に、' 2)あなたは 'のJFrameを使用して' Maybee'クラス(やないで 'JFrame'を拡張しています。 '、あなたが' JFrame'部分を拡張を削除した場合、それは安全ですので、3) 'のsetSize()'、[は|最大| setPreferred呼び出さないのminimumSize()]コールしないでください(https://stackoverflow.com/questions/7229226 /べき-I-避け-利用の-setpreferredmaximumminimumsize-メソッド・イン・ジャワ-SWI)の方法のいずれか、代わりに上書き 'のgetPreferredSize() 'メソッド(または最大値/最小値)。 – Frakcool

+0

こんにちはフラククール、それは速かった。残念ながら(1)は機能せず、(2)はエラーを出します。 (3)私はかなり理解していませんでした。ありがとう – stafford3105

答えて

3

SimPanel.init()で作成されたJPanelの2番目のインスタンスが直ちに問題になります。 SimPanelはすでにJPanelです。public JPanel simPanelメンバーを維持する必要はありません。

同じ問題は、JFrameを拡張しますが、public JFrame maynFrameメンバを維持するMaybeeクラスにあります。また

、すでに(感謝@Frakcool!)上記のコメントで述べたように:

  • setVisible()pack()を呼び出すようにしてください。

  • setPreferredSize()を呼び出しないでください。getPreferredSize() intead;

  • JFrameを拡張する必要はありません。

  • setVisibleの電話番号はJPanelです。

  • btn.setSize()を呼び出さないでください。レイアウトマネージャの仕事です。

  • setContentPane()の必要がありません。JFrameは、デフォルトでコンテンツペインにBorderLayoutというJPanelを持っています。この場合、add()を呼び出すだけで十分です。ここ

は(明確にするために簡略化)元のコードのわずかに変更されたバージョンである:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Maybee2 { 
    static class SimPanel extends JPanel { 
     public SimPanel() { 
      setLayout(new BorderLayout()); 

      JButton btn = new JButton("ENDE"); 
      btn.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        //TODO 
       } 
      }); 
      add(btn, BorderLayout.CENTER); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 200); 
     } 
    } 

    private static void createAndShowGUI() { 
     final JFrame frame = new JFrame("Maybee"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     SimPanel simPanel = new SimPanel(); 
     frame.add(simPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

EDIT

アプリケーションは、多くのパネルから構成されてもよいです。 JFrameなどの上位コンテナは、基本となるレイアウトの複雑さをすべて認識しておらず、特定のサイズを適用できません。パネル自体は内部レイアウトとその内容を知っています。したがって、パネルはレイアウトマネージャに推奨サイズを報告し、最終的にコンテンツをパックします。詳細については、Laying Out Components Within a Containerを参照してください。

setBackgroundは、ボタンがパネルのすべてのスペースを占めるBorderLayoutの中心を占めていますが、その効果があります。パネルのレイアウトを変更し、効果を確認します。 add(btn, BorderLayout.NORTH);A Visual Guide to Layout Managersで続きを読む - または別の領域、すなわちへのボタンを移動します。

+0

@Frakcoolに多くの感謝を!と@tenorsax。ここの思考のための多くの食べ物!! – stafford3105

+1

多くのありがとう。ここの思考のための多くの食べ物!!私はもしかすると2つのさらなる質問があります。 Q1。なぜ私は希望のサイズをオーバーライドしたいのですか? Q2.パネルの背景色を設定すると消えますが、ボタンの背景色を設定するとパネル全体が変わります! – stafford3105

+0

@ stafford3105これは良い質問です!最後の編集を見てください。 – tenorsax

関連する問題