2015-05-16 5 views
0

Мне нужно отформатировать несколько панелей на моей основной панели, однако я обеспокоен тем, какой макет использовать и тем более, как это сделать с помощью определенного макета.Установка нескольких JPanels на JFrame

Компоновка мне нужно как этот

До сих пор код у меня есть это:

public TDPanel(){ 
    this.setPreferredSize(new Dimension(1150,800)); 
    this.setBackground(Color.gray); 
    this.tdWorld = towerOfDefenses; 
    this.setLayout(new FlowLayout()); 

game = new JPanel(); 
game.setBackground(Color.blue); 
game.setPreferredSize(new Dimension(300,300)); 

textBox = new JTextField(); 
textBox.setBackground(Color.ORANGE); 
textBox.setPreferredSize(new Dimension(400,300)); 

menuPanel = new JPanel(); 
menuPanel.setPreferredSize(new Dimension(100,800)); 
menuPanel.setBackground(Color.red); 

this.add(game); 
this.add(textBox); 
this.add(menuPanel); 
} 

Я был бы признателен за любую помощь, оказанную!

+2

Будет ли изменен размер графического интерфейса, и если да, то как назначается дополнительное пространство? –

+3

BTW - Я бы использовал ['GridBagLayout'] (https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html) для этого графического интерфейса. –

+2

Я вижу «BorderLayout», может быть, «GridLayout» или «JSplitPane» или «GridBagLayout» – MadProgrammer

ответ

1

Я бы выбрал как минимум 3 BorderLayout с. Зачем? Поскольку компонент, который вы помещаете в CENTER, будет максимизирован, а для остальных вы можете установить статическую ширину (или высоту) и не должны выполнять дополнительную конфигурацию, чтобы получить желаемое поведение.

+-------------------------+-----------------------+ 
| BorderLayout.CENTER (1) | BorderLayout.EAST (2) | 
+-------------------------+-----------------------+ 

В (1) вы поставите игру панели (3) и "игра управления" (4):

+-------------------------+ 
| BorderLayout.CENTER (3) | 
+-------------------------+ 
| BorderLayout.SOUTH (4) | 
+-------------------------+ 

Если вы хотите, чтобы текстовое поле и кнопку (4) в имеют тот же размер и максимальный (ширина), затем используйте GridLayout, иначе вы можете использовать FlowLayout, чтобы они были проложены с некоторым пространством после него. Но то, что я рекомендую делать здесь, такое же, как для игры и панели меню в (2): используйте BorderLayout и поместите компонент, который хотите увеличить в центре.

Вы можете использовать более сложные LayoutManagers, такие как BoxLayout или GridBagLayout, но на самом деле это не нужно для этого простого макета (угадайте, это вопрос вкуса).

+0

Извините, не могли бы вы подробнее рассказать о 3-х пограничных экранах и как мне создать 3 разных макета? –

+0

Да, я не сказал это явно, но вы можете использовать только простые JPanels и устанавливать только LayoutManager для (1) - (4), а затем там вы помещаете свои оригинальные панели. – maraca

+0

Да, путь - это вложить JPanels каждый, используя свой собственный макет. 1+ @EasonLiu: если бы этот ответ помог вам, вы должны его проголосовать. Если это поможет вам решить вашу проблему, вы должны ее принять. Подробнее об этом читайте в этом разделе на справочном сайте: [кто-то отвечает] (http://stackoverflow.com/help/someone-answers). –

-1

Во-первых, я рекомендую использовать Swing Desinger, это плагин для визуализации вашей операции. Я использую GridBagLayout для форматирования этих панелей, и вот пример. This is the effect drawing adress

public test() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 685, 485); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    GridBagLayout gbl_contentPane = new GridBagLayout(); 
    gbl_contentPane.columnWidths = new int[]{175, 40, 180, 217, 0}; 
    gbl_contentPane.rowHeights = new int[]{15, 58, 220, 49, 55, 0}; 
    gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; 
    gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; 
    contentPane.setLayout(gbl_contentPane); 

    JPanel gamepanel = new JPanel(); 
    GridBagConstraints gbc_gamepanel = new GridBagConstraints(); 
    gbc_gamepanel.fill = GridBagConstraints.BOTH; 
    gbc_gamepanel.insets = new Insets(0, 0, 5, 5); 
    gbc_gamepanel.gridheight = 2; 
    gbc_gamepanel.gridwidth = 3; 
    gbc_gamepanel.gridx = 0; 
    gbc_gamepanel.gridy = 1; 
    contentPane.add(gamepanel, gbc_gamepanel); 
    gamepanel.setLayout(null); 

    JScrollPane scrollPane = new JScrollPane(); 
    GridBagConstraints gbc_scrollPane = new GridBagConstraints(); 
    gbc_scrollPane.fill = GridBagConstraints.BOTH; 
    gbc_scrollPane.insets = new Insets(0, 0, 5, 0); 
    gbc_scrollPane.gridx = 3; 
    gbc_scrollPane.gridy = 1; 
    contentPane.add(scrollPane, gbc_scrollPane); 

    JPanel panel = new JPanel(); 
    GridBagConstraints gbc_panel = new GridBagConstraints(); 
    gbc_panel.fill = GridBagConstraints.BOTH; 
    gbc_panel.gridheight = 3; 
    gbc_panel.gridx = 3; 
    gbc_panel.gridy = 2; 
    contentPane.add(panel, gbc_panel); 
    panel.setLayout(null); 

    textField = new JTextField(); 
    GridBagConstraints gbc_textField = new GridBagConstraints(); 
    gbc_textField.fill = GridBagConstraints.BOTH; 
    gbc_textField.insets = new Insets(0, 0, 0, 5); 
    gbc_textField.gridx = 0; 
    gbc_textField.gridy = 4; 
    contentPane.add(textField, gbc_textField); 
    textField.setColumns(10); 

    JButton btnNewButton = new JButton("New button"); 
    GridBagConstraints gbc_btnNewButton = new GridBagConstraints(); 
    gbc_btnNewButton.fill = GridBagConstraints.BOTH; 
    gbc_btnNewButton.insets = new Insets(0, 0, 0, 5); 
    gbc_btnNewButton.gridx = 2; 
    gbc_btnNewButton.gridy = 4; 
    contentPane.add(btnNewButton, gbc_btnNewButton); 
} 

Если вы хотите GUI может быть изменяемыми, вы можете установить weghitx и weghity свойства.

+0

wow thx для кода, вы могли бы объяснить некоторые части, такие как gridx, gridy и gbc_panel.fill, и как эти виды влияют на панель в целом. –

+0

хорошо, я не хорошо разбираюсь в английском. Поэтому я просто объясняю это насколько могу.'gridx' означает местоположение строки,' gridy' означает расположение столбца. 'gbc_panel'.fill означает растянуть компонент горизонтальным или вертикальным способом. – Mai

+0

Кстати, вы понимаете китайский? – Mai

Смежные вопросы