gpt4 book ai didi

java - Swing 中的固定大小项目

转载 作者:行者123 更新时间:2023-12-01 18:31:26 25 4
gpt4 key购买 nike

我对整个 Swing 还很陌生,但它已经让我很恼火了。

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

我一直在尝试,但就是无法让它发挥作用。我得到的最接近的是 BoxLayout,但是那里的问题是,如果项目太少而无法占用可用空间,它们就会被拉伸(stretch) -.- 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 的回答,我最终编写了自定义渲染器和编辑器。

编辑2:

呃,在打开它之后,我为此被骂得很厉害......显然问题是 JScrollPane 调整视口(viewport)大小,以便控件填充所有可用空间,解决方案是创建 JPanel 实现 Scrollable 并在 public boolean getScrollableTracksViewportHeight() 中返回 false。哦,好吧,我希望有人会觉得它有用,编辑人员真是太痛苦了。

最佳答案

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

关于java - Swing 中的固定大小项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com