Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel中行的动态宽度和固定高度_Java_Swing_Jpanel_Jscrollpane_Layout Manager - Fatal编程技术网

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

Java JPanel中行的动态宽度和固定高度,java,swing,jpanel,jscrollpane,layout-manager,Java,Swing,Jpanel,Jscrollpane,Layout Manager,我正在尝试使用Java布局管理器(我没有外部库,正在使用Java 7)创建一个布局,其中数据以行的形式提供,行具有固定的高度,但宽度填充以适应窗口。下面提供了一个示例: 我的想法是,我将在整个应用程序运行过程中添加行,每一行都将简单地添加到底部列表中。如果窗口中添加的行太多,则会出现一个滚动条(我已排序的位) 到目前为止,我的问题是,如果我对主JPanel使用GridLayout,它将使行填充到整个窗口,并且随着行的增加,每一行都会变小。我希望这样,无论添加了多少行,行的高度始终保持不变 每行

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

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

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

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


我最好使用Swing布局管理器来实现所需的布局,但是如果提出了其他建议,那么我肯定会研究它们。正如许多人在我看到的其他问题中发现的那样,Java的布局管理器在某些方面似乎有点不足,不幸的是,我无法判断什么时候是我的知识不足,而不是语言本身。

我的第一个建议是使用
JTable
,尽管它可能“看起来”复杂,API经过优化,非常高效,可以处理数千行

如果这不符合你的需要,我会考虑使用<代码> GridBagLayout <代码>。如果你不想使用任何第三方库,那么诀窍就是知道如何将它们拼贴起来以实现你想要的结果,例如,下面使用三个面板,主要的“Outter”面板充当主视图和两个内面板。一个用于保存内容,另一个用作填充,因此内容总是被推到视图的顶部

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;
        }

    }

}

请查看以了解更多详细信息


“但是,有没有更简单的办法?”我听到你在问!嗯,您可以使用SwingLabs(或
JTable
)提供的
VerticalLayout

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

如果这不符合你的需要,我会考虑使用<代码> GridBagLayout <代码>。如果你不想使用任何第三方库,那么诀窍就是知道如何将它们拼贴起来以实现你想要的结果,例如,下面使用三个面板,主要的“Outter”面板充当主视图和两个内面板。一个用于保存内容,另一个用作填充,因此内容总是被推到视图的顶部

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;
        }

    }

}

请查看以了解更多详细信息


“但是,有没有更简单的办法?”我听到你在问!那么,您可以使用SwingLabs(或a
JTable
)的
VerticalLayout

JTable
。。。。。。?您也可以查看
GridBagLayout
,但我可能建议使用SwingLabs的
VerticalLayout
,@MadProgrammer我考虑过,但不确定以这种方式使用是否真的合适。因此,如果我使用JTable,我将有2列,然后继续添加行。这一点当然不会太麻烦,但我是否需要CellRenders等有趣的实现来确保行的内容正常工作?我将使用的一个组件是JTextArea,例如,我需要做什么特别的事情来确保它的显示和功能正确吗?好吧,您不会将
JTextArea
添加到
JTable
,而是管理模型中的文本。如果需要能够编辑这些值,这可能会使事情变得复杂一些。您将得到的好处是
JTable
经过优化,可以处理大量的行“正如许多人在我看到的其他问题中发现的那样,Java的布局管理器在某些方面似乎有点欠缺”在许多情况下,程序员对如何跨平台使用可靠GUI的布局缺乏了解,但我只是偶尔看到您所指的内容。@AndrewThompson哈哈哈,这正是我的意思,我严重怀疑这是语言方面的无能。我见过,但正如你所说的,这是难以置信的罕见。
JTable
。。。。。。?您也可以查看
GridBagLayout
,但我可能建议使用SwingLabs的
VerticalLayout
,@MadProgrammer我考虑过,但不确定以这种方式使用是否真的合适。因此,如果我使用JTable,我将有2列,然后继续添加行。这一点当然不会太麻烦,但我是否需要CellRenders等有趣的实现来确保行的内容正常工作?我将使用的一个组件是JTextArea,例如,我需要做什么特别的事情来确保它的显示和功能正确吗?好吧,您不会将
JTextArea
添加到
JTable
,而是管理模型中的文本。如果需要能够编辑这些值,这可能会使事情变得复杂一些。您将得到的好处是
JTable
经过优化,可以处理大量的行“正如许多人在我看到的其他问题中发现的那样,Java的布局管理器在某些方面似乎有点欠缺”在很多情况下,程序员对如何跨平台使用可靠GUI的布局缺乏了解,但我只是偶尔看到您所指的内容。@AndrewThompson哈哈哈,这正是我的意思,我严重怀疑这是局域网上的无能