tipos son manager los fillers cuáles java swing jframe jpanel layout-manager

son - swing fillers java



Agregar componentes a JPanel dentro de un JFrame (1)

De nuevo, no use el diseño nulo, ya que hace que la actualización y el mantenimiento de su GUI sean mucho más difíciles de lo que deberían ser, y puede llevar a una GUI fea si planea ejecutarlos en múltiples plataformas. En lugar

  • Use varios JPanels, cada uno con un grupo central de componentes y cada uno usando su mejor administrador de diseño
  • Nest estos JPanels en otros JPanels que usan el mejor administrador de disposición para mostrarlos
  • y eso permitirá que su GUI sea redimensionable sin necesidad de código adicional.
  • Coloque su JTextAreas en JScrollPanes para que pueda ver todo el texto, incluso si va más allá del área de texto.
  • Nunca configure el tamaño de JTextArea ya que eso no le permitirá desplazarse. En cambio, establezca sus columnas y filas.

Como un ejemplo muy simple, ejecuta esto para ver lo que quiero decir:

import java.awt.*; import javax.swing.*; public class FooSwing2 { public static void main(String[] args) { JTextArea chatArea = new JTextArea(8, 40); chatArea.setEditable(false); chatArea.setFocusable(false); JScrollPane chatScroll = new JScrollPane(chatArea); JPanel chatPanel = new JPanel(new BorderLayout()); chatPanel.add(new JLabel("Chat:", SwingConstants.LEFT), BorderLayout.PAGE_START); chatPanel.add(chatScroll); JTextField inputField = new JTextField(40); JButton sendBtn = new JButton("Send"); JPanel inputPanel = new JPanel(); inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS)); inputPanel.add(inputField); inputPanel.add(sendBtn); JPanel youLabelPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); youLabelPanel.add(new JLabel("You:")); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); mainPanel.add(chatPanel); mainPanel.add(Box.createVerticalStrut(10)); mainPanel.add(youLabelPanel); mainPanel.add(inputPanel); JFrame frame = new JFrame("Foo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(mainPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

Esto daría como resultado una GUI simple (no funcional) que se veía así:

Ahora diga que desea cambiar esto y agregar otro botón, un JButton de "salida" a la derecha del JButton de envío. Si utilizó el diseño nulo, tendría que cambiar el tamaño de su GUI, tendría que mover el botón Enviar hacia la izquierda y asegurarse de que sus cálculos no tuvieran errores, etc. Si usaba gestores de diseño, necesitaría solo dos nuevas líneas de código (para cambiar la pantalla, no la funcionalidad por supuesto):

JTextField inputField = new JTextField(40); JButton sendBtn = new JButton("Send"); JButton exitBtn = new JButton("Exit"); // ***** added JPanel inputPanel = new JPanel(); inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS)); inputPanel.add(inputField); inputPanel.add(sendBtn); inputPanel.add(exitBtn); // ***** added

Eso es todo, y esto mostraría:

Como soy un principiante y no quiero involucrarme con los administradores del diseño, simplemente estaba agregando un JPanel en mi JFrame principal y dando una ubicación específica a cada componente en el panel. Pero de alguna manera la salida parece demasiado incorrecta ...

frame = new JFrame(email + " (Offline)"); frame.setSize(400, 400); frame.setLocation(0, 0); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.setLayout(new FlowLayout()); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { // out.println("BYE"); // out.flush(); frame.dispose(); thread.stop(); } }); panel = new JPanel(); frame.add(panel); chat = new JTextArea(); chat.setSize(400, 200); chat.setLocation(0, 0); chat.setEditable(false); panel.add(chat); panel.validate(); JLabel you = new JLabel("You:"); you.setSize(you.getPreferredSize()); you.setLocation(0, 210); panel.add(you); panel.validate(); input = new JTextArea(); input.setSize(200, 200); input.setLocation(0, 220 + chat.getSize().height); panel.add(input); panel.validate(); send = new JButton("Send"); send.setSize(send.getPreferredSize()); send.setLocation(210, 220 + chat.getSize().height); panel.add(send); panel.validate(); frame.setVisible(true);

El resultado de este marco es que las áreas de texto son invisibles, una etiqueta de You: en el medio y junto a la derecha, el botón. ¿Qué me falta aquí?