使用Swing创建可滚动窗格的问题

时间:2013-11-15 17:31:33

标签: java swing jframe jscrollpane null-layout-manager

我有以下课程......

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);
}

}

但是,如果我不使用滚动窗格,这对我没什么用......

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);
}

但是没有滚动所以只有前几个出现,有人可以帮我解决我所缺少的问题吗?

2 个答案:

答案 0 :(得分:2)

setLayout(null);

不要使用空布局。

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

不要使用setBounds(...)。

当添加到滚动窗格的组件的首选大小大于滚动窗格的大小时,会自动显示滚动条。

让布局经理来完成他们的工作。阅读Layout Managers上的Swing教程中的部分,并使用适当的布局管理器或嵌套布局管理器的组合。

答案 1 :(得分:0)

以下是+ 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);
}

}