我对整个Swing都很陌生,但是它已经让我很生气了。
我正在尝试做一些简单的事情,其行为类似于带有自定义项模板的WPF列表。也就是说,项目具有固定的大小,当它溢出给定区域时会弹出一个滚动条。
我一直在努力尝试,但我无法让它发挥作用。我得到的最接近的是BoxLayout,然而问题是,如果物品太少而无法占用可用空间,它们会被拉伸 - .-
我打赌有一些简单的方法来实现这一点,我只是不知道。提前谢谢。
这是我得到的代码(java):
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class App
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new MainFrame();
}
});
}
}
class MainFrame extends JFrame
{
private JPanel itemsPanel;
private JButton addButton;
public MainFrame()
{
// create components
itemsPanel = new JPanel();
addButton = new JButton("Add");
// layout
itemsPanel.setLayout(new BoxLayout(itemsPanel, BoxLayout.Y_AXIS));
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT));
buttons.add(addButton);
setLayout(new BorderLayout());
add(new JScrollPane(itemsPanel), BorderLayout.CENTER);
add(buttons, BorderLayout.SOUTH);
// actions
addButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
itemsPanel.add(new SampleItem());
itemsPanel.revalidate();
}
});
// frame size and close action
setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension size = new Dimension(300, 300);
setMinimumSize(size);
setSize(size);
setVisible(true);
}
}
class SampleItem extends JPanel
{
public SampleItem()
{
setBorder(BorderFactory.createLineBorder(Color.black));
setPreferredSize(new Dimension(200, 100));
}
}
修改
由于rcook的回答,我最终编写了自定义渲染器和编辑器。
EDIT2:
呃,在把它打开之后,我得到了严厉的责骂...显然问题是JScrollPane调整了视口的大小,以便控件填充所有可用空间,解决方案是创建JPanel implements Scrollable
并返回false在public boolean getScrollableTracksViewportHeight()
。哦,好吧,我希望有人会发现它很有用,编辑们真的很痛苦。
答案 0 :(得分:4)
使用JList,将其放在JScrollPane中,将其放在BorderLayout中间部分的窗格中; BorderLayout是JFrame的默认设置,因此您可能不需要创建一个。将下方按钮放在BorderLayout的底部。