2016-10-02 13 views
1

私はGUIで絶対配置でnullレイアウトを使用するという悪い習慣について読んだので、レイアウトについて学びたいと思っています。場合は、GUIを動的に拡張する柔軟性を奪う。だから私はGUIブロックのいくつかの組み合わせを試している、今私は問題が発生しました。以下は、私が試してみるつもりGUIブロックです:Java Swing Layoutブロック

enter image description here

私はGUIの上部(ブロック1、2 & 3)を実行することから始め、それは次のコードで動作します:

enter image description here

public class LayoutTestGuiDelegate implements Observer{ 
    private LayoutTestModel model; 
    private int totalScreenWidth; 
    private int totalScreenHeight; 
    private JFrame mainFrame; 
    private JPanel totalScreen; 
    private JPanel topScreen; 
    private JPanel botScreen; 
    private JPanel dateScreen; 
    private ImagePanelOne imagePanelOne; 
    private ImagePanelTwo imagePanelTwo; 
    private ImagePanelThree imagePanelThree; 
    private ImagePanelFour imagePanelFour; 
    private ImagePanelFive imagePanelFive; 

public LayoutTestGuiDelegate(LayoutTestModel model){ 
    this.model = model; 
    totalScreenWidth = model.GetScreenWidth(); 
    totalScreenHeight = model.GetScreenHeight(); 
    SetupComponents(); 
} 

public void SetupComponents(){ 
    // set it to full exclusive mode 
    final GraphicsDevice fullScreen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
    mainFrame = new JFrame("Video Clock Display"); 
    mainFrame.setLayout(new GridLayout(1, 1, 0, 0)); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainFrame.setUndecorated(true); // Remove title bar 
    mainFrame.setAlwaysOnTop(false); // Always on top 
    mainFrame.setResizable(false); 
    mainFrame.setVisible(true); 

    totalScreen = new JPanel(new GridLayout(2, 1, 0, 0)); 
    mainFrame.setContentPane(totalScreen); 

    topScreen = new JPanel(new GridLayout(1, 2, 0, 0)); 
    imagePanelOne = new ImagePanelOne(model, 1020, 280); 
    topScreen.add(imagePanelOne); 

    dateScreen = new JPanel(new GridLayout(2, 1, 0, 0)); 
    imagePanelTwo = new ImagePanelTwo(model, 900, 150); 
    dateScreen.add(imagePanelTwo); 
    imagePanelThree = new ImagePanelThree(model, 900, 130); 
    dateScreen.add(imagePanelThree); 
    topScreen.add(dateScreen); 
    totalScreen.add(topScreen); 

    mainFrame.pack(); 
} 

@Override 
public void update(Observable arg0, Object arg1) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      imagePanelOne.repaint(); 
      imagePanelTwo.repaint(); 
      imagePanelThree.repaint(); 
      imagePanelFour.repaint(); 
      imagePanelFive.repaint(); 
     } 
    }); 

} 

} 

私は、底部(ブロック4 & 5)に追加しようとすると、すべてがちょうど奇妙に行きます。これは、次のコードで、次のように現れる:

enter image description here

public class LayoutTestGuiDelegate implements Observer{ 
    private LayoutTestModel model; 
    private int totalScreenWidth; 
    private int totalScreenHeight; 
    private JFrame mainFrame; 
    private JPanel totalScreen; 
    private JPanel topScreen; 
    private JPanel botScreen; 
    private JPanel dateScreen; 
    private ImagePanelOne imagePanelOne; 
    private ImagePanelTwo imagePanelTwo; 
    private ImagePanelThree imagePanelThree; 
    private ImagePanelFour imagePanelFour; 
    private ImagePanelFive imagePanelFive; 

public LayoutTestGuiDelegate(LayoutTestModel model){ 
    this.model = model; 
    totalScreenWidth = model.GetScreenWidth(); 
    totalScreenHeight = model.GetScreenHeight(); 
    SetupComponents(); 
} 

public void SetupComponents(){ 
    // set it to full exclusive mode 
    final GraphicsDevice fullScreen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
    mainFrame = new JFrame("Video Clock Display"); 
    mainFrame.setLayout(new GridLayout(1, 1, 0, 0)); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainFrame.setUndecorated(true); // Remove title bar 
    mainFrame.setAlwaysOnTop(false); // Always on top 
    mainFrame.setResizable(false); 
    mainFrame.setVisible(true); 

    totalScreen = new JPanel(new GridLayout(2, 1, 0, 0)); 
    mainFrame.setContentPane(totalScreen); 

    topScreen = new JPanel(new GridLayout(1, 2, 0, 0)); 
    imagePanelOne = new ImagePanelOne(model, 1020, 280); 
    topScreen.add(imagePanelOne); 

    dateScreen = new JPanel(new GridLayout(2, 1, 0, 0)); 
    imagePanelTwo = new ImagePanelTwo(model, 900, 150); 
    dateScreen.add(imagePanelTwo); 
    imagePanelThree = new ImagePanelThree(model, 900, 130); 
    dateScreen.add(imagePanelThree); 
    topScreen.add(dateScreen); 
    totalScreen.add(topScreen); 

    botScreen = new JPanel(new GridLayout(1, 2, 0, 0)); 
    imagePanelFour = new ImagePanelFour(model, 1420, 800); 
    botScreen.add(imagePanelFour); 
    imagePanelFive = new ImagePanelFive(model, 500, 800); 
    botScreen.add(imagePanelFive); 

    totalScreen.add(botScreen); 
    mainFrame.pack(); 
} 

@Override 
public void update(Observable arg0, Object arg1) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      imagePanelOne.repaint(); 
      imagePanelTwo.repaint(); 
      imagePanelThree.repaint(); 
      imagePanelFour.repaint(); 
      imagePanelFive.repaint(); 
     } 
    }); 

} 

} 

誰もが私が間違ってやっているものを私に伝えることができますか?ありがとう。

+0

Javaチュートリアルでは、NetBeans IDEに組み込まれているようなGUIビルダーを使用することをお勧めします。複雑なレイアウトを手作業で構築するよりもはるかに簡単です。 Docs:https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html – markspace

+0

私はWindows Builderを探していましたが、Eclipseネオンはダウンロードできず、インストールできませんでした。だから私はそれを難し​​い方法でやらなければならなかった。 : – Bou

答えて

1

私はBorderLayoutを使うべきだと思います。最初の3つのコンポーネントを制約エリアに配置します。中央に4を入れ、EASTに5を入れてください。

私が使用したさまざまなパネルにはデフォルトでさまざまな枠やレイアウトがあり、例として使用したボタンはかなり小さいので、以下の例はあなたの写真とまったく同じです。しかし、全体的には、これを手作業で行う必要がある場合は、これが最も簡単になると思います。

小さいパネルを小さなクラスに分けて使用し、小さなコンポーネントからGUIを構成することもお勧めしたいと思います。あなたが上に持っているかなり大きなコードは読みづらいもので扱いにくいものです。

public class LayoutTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
     public void run() 
     { 
      JFrame frame = new JFrame(); 

      TopPanel top = new TopPanel(); 
      frame.add(top, BorderLayout.NORTH); 
      frame.add(new JButton("4")); 
      frame.add(new JButton("5"), BorderLayout.EAST); 

      frame.pack(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
     }); 
    } 
} 

class CenterButtonPanel extends JPanel { 
    public CenterButtonPanel(String name) { 
     JButton but = new JButton(name); 
     add(but); 
    } 
} 

class TopPanel extends JPanel { 
    TopPanel() { 
    Box right = Box.createVerticalBox(); 
    right.add(new CenterButtonPanel("2")); 
    right.add(new CenterButtonPanel("3")); 
    Box left = Box.createHorizontalBox(); 
    left.add(new CenterButtonPanel("1")); 
    left.add(right); 
    add(left); 
    } 
} 
+0

私はそれを試してみて、あなたにお知らせします。ありがとう:D – Bou

+0

それは働いた!!私はBoxとborderLayoutを使って試してみた。 – Bou