0

私は次のクラスを持っています...

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

しかし、スクロールしないので最初の数個しか表示されません。

4

2 に答える 2

2
setLayout(null);

null レイアウトは使用しないでください。

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

setBounds(...) を使用しないでください。

スクロールペインに追加されたコンポーネントの優先サイズがスクロールペインのサイズよりも大きい場合、スクロールバーが自動的に表示されます。

レイアウトマネージャーに仕事をさせてください。レイアウト マネージャーに関する Swing チュートリアルのセクションを読み、適切なレイアウト マネージャーまたはネストされたレイアウト マネージャーの組み合わせを使用します。

于 2013-11-15T17:34:30.197 に答える
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);
}

}
于 2013-11-15T17:40:37.910 に答える