2015-06-25 2 views
-1

У меня есть простой графический интерфейс, и я просто хочу, чтобы некоторые текстовые поля укладывались друг на друга, причем каждая коробка была JPanel. В настоящее время я использую FlowLayout как для JFrame, так и для JPanel, но при максимальном увеличении меняются из stackover. В идеале я бы хотел, чтобы текстовые поля оставались в центре окна, даже если он был максимальным. Я смотрел на использование BoxLayout, но у меня были проблемы с работой.Не удается получить макет качания, чтобы работать, как я хочу.

public static Component textbox(String x){ 
     JPanel panel = new JPanel(new FlowLayout(5,5,5)); 
     JLabel lbltAm= new JLabel(x); 
     JTextField tftAm = new JTextField(10); 
     lbltAm.setFont(new Font("Serif", Font.PLAIN, 14)); 
     lbltAm.setForeground(Color.white); 
     panel.add(lbltAm, BorderLayout.NORTH); 
     panel.add(tftAm, BorderLayout.CENTER); 
     panel.setBackground(Color.DARK_GRAY); 

     Border lowerbevel = BorderFactory.createBevelBorder(BevelBorder.LOWERED); 
     panel.setBorder(lowerbevel); 

     return panel; 
} 

private static void createAndShowGUI() { 

    //Create and set up the window. 


    JFrame frame = new JFrame("Tip Calculator"); 
    //Add Textbox 
    frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS)); 
    String Label = "Tip Calculator"; 
    JLabel header = new JLabel(Label); 
    header.setFont(new Font("Serif", Font.BOLD, 18)); 
    frame.add(header); 

    frame.add(textbox("Total")); 
    frame.add(textbox("Tip %")); 
    frame.add(textbox("People")); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setBackground(Color.gray); 
    frame.setPreferredSize(new Dimension(300, 400)); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 
+1

Пожалуйста [принимать] (http://meta.stackexchange.com/a/5235/155831) некоторые ответы на предыдущие вопросы [] (http://stackoverflow.com/users/3769402/user3769402?tab=questions)! –

+0

К сожалению, просто сделал это. Конечно, всегда кажется, что один ответ приводит к другому ответу. – user3769402

+0

Ну, это * одно вниз *, но как насчет других 16?!? –

ответ

2

Это вопрос мнения, но гибкость, я предпочитаю использовать GridBagLayout

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.BevelBorder; 
import javax.swing.border.Border; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(textbox("Total"), gbc); 
      add(textbox("Tip %"), gbc); 
      add(textbox("People"), gbc); 
     } 

     public Component textbox(String x) { 
      JPanel panel = new JPanel(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.insets = new Insets(5, 5, 5, 5); 

      JLabel lbltAm = new JLabel(x); 
      JTextField tftAm = new JTextField(10); 
      lbltAm.setFont(new Font("Serif", Font.PLAIN, 14)); 
      lbltAm.setForeground(Color.white); 

      panel.add(lbltAm, gbc); 
      panel.add(tftAm, gbc); 
      panel.setBackground(Color.DARK_GRAY); 

      Border lowerbevel = BorderFactory.createBevelBorder(BevelBorder.LOWERED); 
      panel.setBorder(lowerbevel); 

      return panel; 
     } 
    } 

} 

Или, если ваш хотел «коробки», чтобы занять всю площадь при расширении, вы можете использовать что-то вроде ...

GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.gridwidth = GridBagConstraints.REMAINDER; 
    gbc.weightx = 1; 
    gbc.weighty = 1; 
    gbc.fill = GridBagConstraints.BOTH; 
    add(textbox("Total"), gbc); 
    add(textbox("Tip %"), gbc); 
    add(textbox("People"), gbc); 

Какие результаты в чем-то вроде ...

enter image description here

Посмотрите Laying Out Components Within a Container и How to Use GridBagLayout для получения более подробной информации

+0

Хорошо, первый пример больше похож на то, что я искал. Спасибо за примеры, я все еще очень новичок в графическом интерфейсе, так что все еще пытаюсь получить ручку на разных макетах. – user3769402

+0

Макеты - это весело :) – MadProgrammer

1

Попробуйте использовать GridLayout вместо BoxLayout в createAndShowGUI.

frame.setLayout(new GridLayout(4,1)); 
2

Во-первых, я не знаю, почему вы добавляете компоненты к JPanel с помощью метода, который для BorderLayout после того как вы установите расположение панели в качестве FlowLayout.

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

frame.setLayout(new GridLayout(3 *(number of rows/components)*, 1)); 

Вы можете сделать то же самое с JPanel. После этого установите горизонтальное выравнивание каждого компонента по центру так:

component.setHorizontalAlignment(componentName.CENTER); 

Надеюсь, что это поможет!

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