Java 为JPanel创建垂直可滚动窗格
我正在尝试创建一个JScrollPane,其中包含具有JFreeChart API图表的JPanel。GenerateChartPanel是一种在JPanel中返回图表的方法,因此我可以快速生成一组图表。到目前为止,我主要有以下几点:Java 为JPanel创建垂直可滚动窗格,java,swing,layout,jscrollpane,Java,Swing,Layout,Jscrollpane,我正在尝试创建一个JScrollPane,其中包含具有JFreeChart API图表的JPanel。GenerateChartPanel是一种在JPanel中返回图表的方法,因此我可以快速生成一组图表。到目前为止,我主要有以下几点: public static void main (String[] args){ JFrame main = new JFrame(); main.setLayout(new BorderLayout()); main.setPrefe
public static void main (String[] args){
JFrame main = new JFrame();
main.setLayout(new BorderLayout());
main.setPreferredSize(new Dimension(500,500));
//Creates specFrame
JScrollPane specScrollPane = new JScrollPane();
JPanel container = new JPanel();
container.setLayout(new GridLayout());
container.add(generateSpecPanelFromSmiles("C"));
container.add(generateSpecPanelFromSmiles("CC"));
container.add(generateSpecPanelFromSmiles("CCC"));
container.setVisible(true);
specScrollPane.setVisible(true);
specScrollPane.add(container);
main.add(specScrollPane);
RefineryUtilities.centerFrameOnScreen(main);
main.setVisible(true);
当我运行这个时,什么都没有显示。显然,你不能打包、设置关闭、设置布局或居中这些窗格,所以我把它们注释掉了。我错过了什么
编辑:获取尺寸
specPanel.addComponentListener(new java.awt.event.ComponentAdapter() {
@Override
public void componentResized(ComponentEvent event) {
specPanel.setSize(Math.min(specPanel.getPreferredSize().width, specPanel.getWidth()),
Math.min(specPanel.getPreferredSize().height, specPanel.getHeight()));
}
});
谢谢- 只指定嵌套一个
- 您必须在
中添加另一个组件,您可以在JScrollPane
中添加三个组件JPanel
- 必须更改父级
(包含三个组件)的默认值,这取决于这些组件中的哪一个,它们如何返回其首选大小,可能从开始JPanel
generateSpectPanelFromSmiles
是什么,to都必须将PreferredSize
返回到parentPanel
,例如(使用GridLayout
和BoxLayout
-框接受最小、最大和首选大小)
- 只指定嵌套一个
- 您必须在
中添加另一个组件,您可以在JScrollPane
中添加三个组件JPanel
- 必须更改父级
(包含三个组件)的默认值,这取决于这些组件中的哪一个,它们如何返回其首选大小,可能从开始JPanel
generateSpectPanelFromSmiles
是什么,to都必须将PreferredSize
返回到parentPanel
,例如(使用GridLayout
和BoxLayout
-框接受最小、最大和首选大小)
我按照你的建议做了,现在我有了一个JPanel(容器),我在其中添加了3个JPanel。我将容器JPanel添加到ScrollPane,但现在我只得到一个不包含任何内容的小框。(见上文)取决于(我的第3点)childs如何将其PreferredSize返回到容器(JPanel),您可以非常确定我实现了您的建议。在创建specPanel之后,我添加了上面编辑的代码(specPanel是图表所在的Jpanel)。这就是你的意思吗?不是ComponentListener不是一个好方法,我会按照你的建议编辑我的文章,我现在有一个JPanel(容器),我在其中添加了3个JPanel。我将容器JPanel添加到ScrollPane,但现在我只得到一个不包含任何内容的小框。(见上文)取决于(我的第3点)childs如何将其PreferredSize返回到容器(JPanel),您可以非常确定我实现了您的建议。在创建specPanel之后,我添加了上面编辑的代码(specPanel是图表所在的Jpanel)。这就是你的意思吗?不是ComponentListener不是一个好方法,我会用一些关于更好的帮助的东西来编辑我的帖子,尽快发布一个(最小完整和可验证的示例)。要更快地获得更好的帮助,发布一个(最小完整和可验证的示例)。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class JPanelsInsideJScrollPane {
private JFrame frame = new JFrame("JPanels Inside JScrollPane");
private JScrollPane scrollPane = new JScrollPane();
private JPanel parentPanel, childOne, childTwo, childThree;
private JButton button = new JButton("Change, Switch Layout Manager to BoxLayout");
public JPanelsInsideJScrollPane() {
parentPanel = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(new Dimension(800, 600));
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.DARK_GRAY);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
};
parentPanel.setLayout(new GridLayout(0, 1));
childOne = new JPanel() {
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 300);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(500, 300);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
};
childTwo = new JPanel() {
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(600, 400);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
};
childThree = new JPanel() {
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
@Override
public Dimension getMaximumSize() {
return new Dimension(800, 600);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.ORANGE);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
};
parentPanel.add(childOne);
parentPanel.add(childTwo);
parentPanel.add(childThree);
scrollPane.setViewportView(parentPanel);
scrollPane.getVerticalScrollBar().setUnitIncrement(30);
scrollPane.getHorizontalScrollBar().setUnitIncrement(30);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LayoutManager manager = parentPanel.getLayout();
if ((manager != null) && (manager instanceof BoxLayout)) {
parentPanel.setLayout(new GridLayout(0, 1));
button.setText("Change, Switch Layout Manager to BoxLayout");
} else if ((manager != null) && (manager instanceof GridLayout)) {
parentPanel.setLayout(new BoxLayout(parentPanel, BoxLayout.PAGE_AXIS));
button.setText("Change, Switch Layout Manager to GridLayout");
}
parentPanel.revalidate();
parentPanel.repaint();
}
});
frame.add(scrollPane);
frame.add(button, BorderLayout.SOUTH);
frame.setSize(400, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JPanelsInsideJScrollPane();
}
});
}
}