2012-06-10 4 views
3

У меня есть две панели в моем кадре, и я хотел бы установить их под другим, и этот первый должен иметь размер как 9/10 * рамка экрана, а эта вторая 1/10.Два JPanels в JFrame, один под другим

Я попытался с GridLayout (2 строки и один столбец), но я не могу установить их конкретный размер.

Как мне это сделать?


нормально, может быть, я буду писать некоторые мой код:

Я пишу игру - Pacman, и в первой панели есть вся игра, и в этом втором я хотел бы, чтобы отобразить игрок информацию (как оценка, имя и т. д.). Сначала я хотел бы установить на 80% экран, а второй - на 20%.

Что еще нужно изменить размер рамки и все в ней, я должен изменить размер панелей (сохраняя это 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(); 
     } 
    }); 
} 



} 
+0

Есть один изменчивый, но другой нет? Что находится в двух панелях? –

+0

Вы отправили некоторый код ... но посмотрели ли вы на уже полученные ответы? (Кроме того, вы действительно должны взглянуть на Java [кодовые соглашения] (http://www.oracle.com/technetwork/java/codeconv-138413.html) – amaidment

ответ

1

Вы можете использовать Border Layout

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

Установите большую панель на CENTER, и тем меньше будет PAGE_END. Установите размер большей панели, а меньшая панель будет использовать то, что осталось.

3

GridLayout - неправильный макет, если вы хотите компоненты разного размера. В качестве javadoc состояний:

Контейнер разделен на равные по размеру прямоугольников, и один компонент помещается в каждом прямоугольнике.

Если вы только получили JPanel с, Вы могли бы хотеть рассмотреть JSplitPane - см javadoc или tutorial.

EDIT: на основе вашего редактирования/кода JSplitPane действительно выглядит как решение вашей проблемы. Затем вы можете установить местоположение разделителя после создания с помощью setDividerLocation(double) - см. javadoc - например.

JSplitPane split = new JSplitPane(JSplitPane.VERTICAL); 
split.setTopComponent(topPanel); 
split.setBottomComponent(bottomPanel); 
split.setDividerLocation(0.8); 

В качестве альтернативы, так как это довольно трудно предположить, макет, не зная ваши намерения для GUI, вы должны рассмотреть возможность взглянуть на Visual Guide на макетах.

2

Посмотрите на этот выход:

GRIDBAGLAYOUTEXAMPLE

А вот код для этого, вы не предполагается использовать 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(); 
      }   
     }); 
    } 
}