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í?