有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Swing中的java固定大小项目

我对这整个秋千还不太熟悉,但它已经让我很恼火了

我正在尝试做一些简单的事情,其行为类似于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调整了viewport的大小,以便控件填充所有可用空间,解决方案是创建JPanel implements Scrollable,并在public boolean getScrollableTracksViewportHeight()中返回false。哦,好吧,我希望有人会觉得它有用,编辑就是这么痛苦


共 (1) 个答案

  1. # 1 楼答案

    使用JLIST,将其放入JSCRelpANE中,将其放入边框中间部分的窗格中;BorderLayout是JFrame的默认设置,因此您可能不需要创建一个。将下部按钮置于BorderLayout的底部