Swing中的java固定大小项目
我对这整个秋千还不太熟悉,但它已经让我很恼火了
我正在尝试做一些简单的事情,其行为类似于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调整了viewport的大小,以便控件填充所有可用空间,解决方案是创建JPanel implements Scrollable
,并在public boolean getScrollableTracksViewportHeight()
中返回false。哦,好吧,我希望有人会觉得它有用,编辑就是这么痛苦
# 1 楼答案
使用JLIST,将其放入JSCRelpANE中,将其放入边框中间部分的窗格中;BorderLayout是JFrame的默认设置,因此您可能不需要创建一个。将下部按钮置于BorderLayout的底部