Swing中固定大小的项目

时间:2014-06-01 13:06:51

标签: java swing layout

我对整个Swing都很陌生,但是它已经让我很生气了。

我正在尝试做一些简单的事情,其行为类似于带有自定义项模板的WPF列表。也就是说,项目具有固定的大小,当它溢出给定区域时会弹出一个滚动条。 desired outcome

我一直在努力尝试,但我无法让它发挥作用。我得到的最接近的是BoxLayout,然而问题是,如果物品太少而无法占用可用空间,它们会被拉伸 - .- closest I got

我打赌有一些简单的方法来实现这一点,我只是不知道。提前谢谢。

这是我得到的代码(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()。哦,好吧,我希望有人会发现它很有用,编辑们真的很痛苦。

1 个答案:

答案 0 :(得分:4)

使用JList,将其放在JScrollPane中,将其放在BorderLayout中间部分的窗格中; BorderLayout是JFrame的默认设置,因此您可能不需要创建一个。将下方按钮放在BorderLayout的底部。