Pregunta

Tengo la siguiente clase ...

public class MessageFrame extends JFrame {

public MessageFrame(List<HistoryMessage> messages){
    setLayout(null);
    JPanel container = new JPanel();
    JScrollPane scrPane = new JScrollPane(container);
    getContentPane().add(scrPane);
    int i = 1;
    for(HistoryMessage m : messages){
        //TODO: needs to be StringBuilder
        StringBuilder sb = new StringBuilder();
        sb.append("<html> <strong>");
        sb.append(m.getSender());
        sb.append(" ");
        Date d = new Date(m.getDate());
        sb.append(d);
        sb.append(":</strong>");
        sb.append(m.getPayload());
        sb.append("</html>");
        JLabel l = new JLabel(sb.toString());
        l.setBounds(30, i, 400, 50);
        i += 125;
        container.add(l);
    }
    setTitle("Messages");
    setSize(500,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
}

}

Esto no me muestra nada, sin embargo, si no uso el panel de desplazamiento, esto funciona ...

public MessageFrame(List<HistoryMessage> messages){
    setLayout(null);
    int i = 1;
    for(HistoryMessage m : messages){
        //TODO: needs to be StringBuilder
        StringBuilder sb = new StringBuilder();
        sb.append("<html> <strong>");
        sb.append(m.getSender());
        sb.append(" ");
        Date d = new Date(m.getDate());
        sb.append(d);
        sb.append(":</strong>");
        sb.append(m.getPayload());
        sb.append("</html>");
        JLabel l = new JLabel(sb.toString());
        l.setBounds(30, i, 400, 50);
        i += 125;
        add(l);
    }
    setTitle("Messages");
    setSize(500,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
}

Pero no hay desplazamiento, así que solo los primeros aparecen, ¿puede alguien ayudarme con lo que me falta?

¿Fue útil?

Solución

setLayout(null);

No use un diseño nulo.

l.setBounds(30, i, 400, 50);

No use SetBounds (...).

Las barras de desplazamiento aparecerán automáticamente cuando el tamaño preferido del componente agregado al ScrollPane es mayor que el tamaño del panel de desplazamiento.

Deja que los administradores de diseño en sus trabajos.Lea la sección de The Swing Tutorial en gerentes de diseño y use unAdministrador de diseño apropiado o combinación de administradores de diseño anidado.

Otros consejos

Aquí está la nueva versión que funciona después de los cambios de + Camickr ...

public class MessageFrame extends JFrame {

public MessageFrame(List<HistoryMessage> messages){
    JPanel container = new JPanel();
    container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
    JScrollPane scrPane = new JScrollPane(container);
    getContentPane().add(scrPane);
    int i = 1;
    for(HistoryMessage m : messages){
        //TODO: needs to be StringBuilder
        StringBuilder sb = new StringBuilder();
        sb.append("<html> <strong>");
        sb.append(m.getSender());
        sb.append(" ");
        Date d = new Date(m.getDate());
        sb.append(d);
        sb.append(":</strong>");
        sb.append(m.getPayload());
        sb.append("</html>");
        JLabel l = new JLabel(sb.toString());
        i += 125;
        container.add(l);
    }
    setTitle("Messages");
    setSize(500,500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
}

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top