3

フレームに 2 つのパネルがあり、それらを上下に配置したいと考えています。最初のパネルは 9/10* スクリーン フレーム、2 番目のパネルは 1/10 のサイズにする必要があります。

GridLayout (2 行と 1 列) を試しましたが、特定のサイズを設定できません。

どうすればいいですか?


わかりました多分私はいくつかの私のコードを書きます:

私はゲーム-パックマンを書いています。最初のパネルにはゲーム全体があり、この2番目のパネルにはプレーヤー情報(スコア、名前など)を表示したいと思います。これは最初に80%の画面に設定したいと思います。 20% で 2 番目。

さらに、フレームのサイズが変更されている場合は、パネルのサイズを変更する必要があります (これを 80% から 20% に維持する必要があります)。だから私はこの InitComponents() を書きました。

package pacman;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import java.awt.Image;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

public class Pacman extends JFrame implements items
{
   Image image;
public Pacman()

{    
    initComponents();
    try {           
      image = ImageIO.read( Pac.class.getResourceAsStream("/img/Pac02.gif"));         
    } catch (Exception e) {
        System.out.println("Blad prz otwieraniu " + e);
        System.exit(0);
       }


    int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;
    int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;      
    this.setLocation(screen_width/3, screen_height/3); 

    this.setLayout(new BorderLayout());
    this.getContentPane().add(panel, BorderLayout.CENTER);
    this.getContentPane().add(panel2, BorderLayout.PAGE_END);



    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setIconImage(image);

setTitle("..::Pacman::..");
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(416,438));
this.pack();
setLocationRelativeTo(null);


setVisible(true);
}
private void initComponents() {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  this.addComponentListener(new ComponentAdapter() {
      @Override
  public void componentResized(ComponentEvent e) {

        int width = e.getComponent().getSize().width;
           int height = e.getComponent().getSize().height;
            panel.setSize(width, height*8/10) ;
           panel2.setSize(width, height*2/10);

}
});


} 

public static void main(String[] args) {  
  EventQueue.invokeLater(new Runnable() {  

      @Override  
      public void run() {  
         new Pacman();
      }  
  });  
}  



}
4

4 に答える 4

4
于 2012-06-10T13:17:28.040 に答える
2

この出力を見てください:

グリッドバッグレイアウトの例

そして、これがそのコードです。GridLayoutサイズを調整する必要があるときに使用することは想定されていません。columns/rowsそのような状況ではGridBagLayout、助けになります。

import java.awt.*;
import javax.swing.*;
// http://stackoverflow.com/questions/10968853/two-jpanels-in-jframe-one-under-other
public class GridBagLayoutExample
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 0.9;

        JPanel topPanel = new JPanel();
        topPanel.setOpaque(true);
        topPanel.setBackground(Color.WHITE);
        contentPane.add(topPanel, gbc);

        gbc.weighty = 0.1;
        gbc.gridy = 1;

        JPanel bottomPanel = new JPanel();
        bottomPanel.setOpaque(true);    
        bottomPanel.setBackground(Color.BLUE);
        contentPane.add(bottomPanel, gbc);

        frame.setContentPane(contentPane);
        frame.setSize(200, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new GridBagLayoutExample().displayGUI();
            }           
        });
    }
}
于 2012-06-10T14:17:45.487 に答える
1

確認してください。下にあるということは、一方が他方Jpanelに重なっているということです。

http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

乾杯!

于 2012-06-10T12:58:21.660 に答える
1

ボーダーレイアウトを使用できます

http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

大きいパネルを CENTER に、小さいパネルを PAGE_END に設定します。大きい方のパネルのサイズを設定すると、小さい方のパネルが残っているスペースを使用します。

于 2012-06-10T13:08:31.220 に答える