[英]Scrollable JPanel in a CardLayout?
我一直在寻找一种向JPanel
添加垂直滚动条的方法,而JPanel
又将其添加到CardLayout
面板中。 我在这里查找了所有与实现可滚动JPanel
有关的帖子,但我不知道如何使用此特定CardLayout
来实现它。 Oracle没有给出我可以使用的示例。
也许我没有为JWindow
或Im使用的任何其他组件使用正确的配置。
我将程序的简化版本放在下面,我想为其实现垂直滚动条。
我的问题是如何在代码底部实现JPanelScrollable
类,使其可以滚动?
import javax.swing.*;
import java.awt.*;
import java.net.URL ;
public class Program2 extends JFrame
{
public Program2()
{
super("Flash CC");
Container2 container = new Container2();
setSize(700, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setFocusable( true ) ;
add(container);
setVisible(true) ;
}
public static void main(String[] args)
{
Program2 prog = new Program2();
}
}
class Container2 extends JPanel
{
private CardLayout cardLayout = new CardLayout() ;
private JPanel1 jPanelFirst = new JPanel1() ;
private JPanel2 jPanelSecond = new JPanel2() ;
private JPanelScrollable jPanelThird = new JPanelScrollable() ;
//Constructor
Container2()
{
this.setLayout( cardLayout ) ;
this.setFocusable( true ) ;
JScrollPane scrollFrame = new JScrollPane(jPanelThird);
this.add( jPanelFirst, "first card" ) ;
this.add( jPanelSecond, "second card" ) ;
this.add( scrollFrame , "third card" ) ;
cardLayout.show( this, "third card" ) ;
}
}
class JPanel1 extends JPanel
{
}
class JPanel2 extends JPanel
{
}
class JPanelScrollable extends JPanel
{
// here many, many, many elemnts will go
// and a vertical scroll barr is needed to view'm all.
JPanelScrollable()
{
this.setOpaque( true ) ;
this.setLayout( null ) ;
for(int i=0; i<30; i++)
{
JButton b = new JButton("Button" + i) ;
b.setBounds(0, (i * 100), 100, 50) ;
this.add(b) ;
}
}
}
Container.add(...)
方法接受任何组件。 CardLayout不限于面板。
将面板添加到JScrollPane并将滚动窗格添加到卡布局。
将面板添加到JScrollPane
JScrollPane scrollPane = new JScrollPane(jPanelThird);
将滚动窗格添加到CardLayout
this.add(scrollPane, "third card");
有关更多详细信息,请参见如何使用滚动窗格 。
更新了工作示例
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestCardLayout {
public static void main(String[] args) {
new TestCardLayout();
}
private int index = 0;
public TestCardLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
final CardLayout cl = new CardLayout();
final JPanel cardPane = new JPanel(cl);
cardPane.add(new JLabel("Hello"), "1");
cardPane.add(new JScrollPane(createForm()), "2");
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(cardPane);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
JButton next = new JButton("Next");
next.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
index++;
if (index > 1) {
index = 0;
}
if (index == 0) {
cl.show(cardPane, "1");
} else {
cl.show(cardPane, "2");
}
}
});
frame.add(next, BorderLayout.SOUTH);
}
});
}
public JPanel createForm() {
JPanel form = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
for (int index = 0; index < 100; index++) {
form.add(new JTextField(10), gbc);
}
return form;
}
}
如果您使用的是eclipse,请考虑使用WindowBuilder 。 它是免费的,并且允许您通过拖放和更改某些属性来执行所需的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.