我只是学习创建使者例如App。我设置父JPanel的布局GridLayout
网格。
现在我想的JPanel显示滚动条时,我添加更多JPanels超过父JPanel的大小。
我试着将它添加到ScrollPane中,但它不工作娄是一个示例图像,
很抱歉,如果我的问题是不能完全解释的。我会尝试,如果需要更多的解释。
路上,我看到它,你的情况与BoxLayout
(用小“伎俩”)内Y_AXIS
一个BorderLayout
会更优雅。看看下面SSCCE:有一行为了回答你的问题,以网格布局发表评论。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.border.LineBorder;
public class ChatFrame extends JFrame {
static int x = 1;
public ChatFrame() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500, 500);
setLocationRelativeTo(null);
getContentPane().setLayout(new BorderLayout());
JPanel gridPanel = new JPanel(new GridLayout(0, 1));
// Comment the following line to see behavior with grid layout
gridPanel.setLayout(new BoxLayout(gridPanel, BoxLayout.Y_AXIS));
final JScrollPane sp = new JScrollPane(gridPanel);
getContentPane().add(sp);
final String helloWorld = "Hello world, ";
Timer t = new Timer(1000, e -> {
ChatPanel cp = new ChatPanel(helloWorld + (x++));
gridPanel.add(cp);
// Scroll to the last chat.
sp.getVerticalScrollBar().setValue(sp.getVerticalScrollBar().getMaximum());
gridPanel.repaint();
gridPanel.revalidate();
});
t.start();
}
private static class ChatPanel extends JPanel {
public ChatPanel(String chat) {
super(new BorderLayout());
setBorder(new LineBorder(Color.red));
JLabel chatLabel = new JLabel(chat);
add(chatLabel, BorderLayout.CENTER);
// a kind of "trick"
setMaximumSize(new Dimension(getMaximumSize().width, getPreferredSize().height));
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ChatFrame().setVisible(true));
}
}
预习:
每个人都试图解决我的问题,但在我的情况下,它并不能帮助我。所以我尝试一切可能的事情,我可以。
因为我看到scrollBar
的JScrollPanel
出现根据JPanel
的大小,所以我试图增加JPanel
的大小,这解决了我的问题。下面是我所说的例子和说明。
加入所有JPanels
到父JPanel
后,我配置父height
的JPanel
到{父height
的JPanel
+(子height
的JPanel
* number of msgs
)}
考虑下面的代码:
msgPanel.setPreferredSize(new Dimension(268,418+(new msg().getPreferredSize().height*(msgs.length-4)));
这里的-4
是做可以容纳父JPanels
的默认大小JPanel
的默认号码