JPanel中行的动态宽度和固定高度

斯蒂沃

我正在尝试使用Java布局管理器(我没有外部库,并且正在使用Java 7)来创建一种布局,其中数据以行的形式提供,其中行具有固定的高度,但是宽度会填充以适合窗口。下面提供了一个示例:

布局示例

我的想法是,我将在应用程序的整个运行过程中添加行,并且每行都将被简单地添加到底部列表中。如果窗口中添加了太多行,则会出现一个滚动条(我已对该行进行了排序)。

到目前为止,我的问题是,如果我对主JPanel使用GridLayout,它将使行填充到整个窗口中,并且随着添加更多行,使每行变小。我想要这样,无论添加多少行,行的高度始终保持不变。

每行由两列组成,其宽度应相同。因此,为此,我认为GridLayout可以很好地工作,但是我认为我需要将GridLayout添加到另一个代表整个行的面板中。

最好使用Swing布局管理器来实现所需的布局,但是如果提出了其他建议,那么我一定会对其进行研究。正如我看到的许多其他问题中发现的那样,许多人似乎都发现Java的布局管理器似乎在某些领域有所欠缺,不幸的是,我无法确定何时缺少我的知识,而不是语言本身。

疯狂程序员

我的第一个建议是使用JTable,虽然它似乎“看起来”很复杂,但该API已经过优化,非常高效,可以处理数千行

如果那不能满足您的需求,那么我会考虑使用GridBagLayout如果您不想使用任何第三方库,诀窍是知道如何操纵它们以实现所需的结果,例如,以下示例使用了三个面板,充当主视图的主“外部”面板和两个内部面板。一个用来容纳内容,另一个用来充当填充物,因此内容总是被推到视图的顶部。

布局

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                TestPane tp = new TestPane();
                JButton add = new JButton("Add Row");
                add.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        tp.addRow();
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(tp));
                frame.add(add, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel implements Scrollable {

        private JPanel content;
        private JPanel filler;

        private GridBagConstraints masterConstraints;

        public TestPane() {

            content = new JPanel(new GridBagLayout());
            filler = new JPanel();

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            add(content, gbc);
            gbc.weighty = 1;
            add(filler, gbc);

            masterConstraints = new GridBagConstraints();
            masterConstraints.gridwidth = GridBagConstraints.REMAINDER;
            masterConstraints.weightx = 1;
            masterConstraints.fill = GridBagConstraints.HORIZONTAL;
        }

        public void addRow() {
            JLabel label = new JLabel("This is just a label, but technically, you can anythig you want");
            content.add(label, masterConstraints);
            revalidate();
            repaint();
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(200, 200);
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 64;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 64;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            Container parent = getParent();
            boolean trackWidth = false;
            if (parent instanceof JViewport) {
                trackWidth = parent.getHeight() > getPreferredSize().width;
            }
            return trackWidth;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            Container parent = getParent();
            boolean trackHeight = false;
            if (parent instanceof JViewport) {
                trackHeight = parent.getHeight() > getPreferredSize().height;
            }
            return trackHeight;
        }

    }

}

看看如何使用GridBagLayout了解更多详细信息

“但是,难道没有更简单的方法吗?” 我听到你在问!好的,您可以使用VerticalLayoutSwingLabs的SwingX库(或JTable

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CSS图像固定高度动态宽度

来自分类Dev

动态和固定宽度的CSS

来自分类Dev

如何设置jpanel的高度和宽度

来自分类Dev

如何获得JPanel宽度和高度相等

来自分类Dev

如何将UIScrollView内容大小配置为具有固定宽度和动态高度?

来自分类Dev

固定的SVG高度和可变(100%)宽度

来自分类Dev

如何固定WPF窗口的高度和宽度

来自分类Dev

以固定的高度和宽度换行图像

来自分类Dev

动态获取布局的高度和宽度

来自分类Dev

动态报告-设置报告的宽度和高度

来自分类Dev

动态获取布局的高度和宽度

来自分类Dev

JPanel的宽度和高度为0(特定情况)

来自分类Dev

如何从构造函数中获取JPanel的宽度和高度?

来自分类Dev

如何避免用户调整Datagrid中行和列的宽度,高度

来自分类Dev

具有100%宽度和固定高度的背景视频

来自分类Dev

创建没有固定宽度和高度的圆形图像边框

来自分类Dev

如何以固定的宽度和高度显示Webview

来自分类Dev

在Swift中为“ CropRect”设置固定的宽度和高度

来自分类Dev

如何将固定宽度和高度设置为SVG

来自分类Dev

固定宽度和高度的UILabel是否需要SizeThatFits调用

来自分类Dev

自动布局显示按钮不固定高度和宽度的圆形

来自分类Dev

实现了任何 HTML 元素的固定宽度和高度

来自分类Dev

Threejs:如何动态改变平面的宽度和高度?

来自分类Dev

Android:动态创建的NetworkImageView的宽度和高度返回零

来自分类Dev

根据数据动态设置SVG的宽度和高度

来自分类Dev

Openlayers动态视口的宽度和高度分配

来自分类Dev

Android动态获取ImageView的实际高度和宽度

来自分类Dev

在动态高度和宽度父级中将元素居中

来自分类Dev

如何为展开的视图设置动态宽度和高度(按钮)

Related 相关文章

  1. 1

    CSS图像固定高度动态宽度

  2. 2

    动态和固定宽度的CSS

  3. 3

    如何设置jpanel的高度和宽度

  4. 4

    如何获得JPanel宽度和高度相等

  5. 5

    如何将UIScrollView内容大小配置为具有固定宽度和动态高度?

  6. 6

    固定的SVG高度和可变(100%)宽度

  7. 7

    如何固定WPF窗口的高度和宽度

  8. 8

    以固定的高度和宽度换行图像

  9. 9

    动态获取布局的高度和宽度

  10. 10

    动态报告-设置报告的宽度和高度

  11. 11

    动态获取布局的高度和宽度

  12. 12

    JPanel的宽度和高度为0(特定情况)

  13. 13

    如何从构造函数中获取JPanel的宽度和高度?

  14. 14

    如何避免用户调整Datagrid中行和列的宽度,高度

  15. 15

    具有100%宽度和固定高度的背景视频

  16. 16

    创建没有固定宽度和高度的圆形图像边框

  17. 17

    如何以固定的宽度和高度显示Webview

  18. 18

    在Swift中为“ CropRect”设置固定的宽度和高度

  19. 19

    如何将固定宽度和高度设置为SVG

  20. 20

    固定宽度和高度的UILabel是否需要SizeThatFits调用

  21. 21

    自动布局显示按钮不固定高度和宽度的圆形

  22. 22

    实现了任何 HTML 元素的固定宽度和高度

  23. 23

    Threejs:如何动态改变平面的宽度和高度?

  24. 24

    Android:动态创建的NetworkImageView的宽度和高度返回零

  25. 25

    根据数据动态设置SVG的宽度和高度

  26. 26

    Openlayers动态视口的宽度和高度分配

  27. 27

    Android动态获取ImageView的实际高度和宽度

  28. 28

    在动态高度和宽度父级中将元素居中

  29. 29

    如何为展开的视图设置动态宽度和高度(按钮)

热门标签

归档