【问题标题】:Making a vertical scrolling JFrame with FLowLayout使用 FLowLayout 制作垂直滚动的 JFrame
【发布时间】:2013-06-24 20:51:43
【问题描述】:

我正在编写一个简单的应用程序,一个方程系统求解器。 它背后的基本思想是从用户那里获取系统中的变量数量,然后动态创建那么多JTextFields,然后一个按钮,来解决系统问题。

为了实现它,我正在努力设置垂直滚动条。

发生的情况是,使用 JScrollPane 后布局变得一团糟。

我以this 为指导并尝试以这种方式使用 VERTICAL_ALWAYS 和 HORIZONTAL_NEVER,但它不起作用。

控件横向放置,而不是一个接一个地从上到下。

如何做到这一点?

public class SolverUserInterface implements ActionListener{

    private JFrame solverUI;
    private JPanel panel;
    private JLabel lbl[];
    private JTextField eq_Fields[];

    public SolverUserInterface(int Count) {
        // TODO Auto-generated constructor stub
        solverUI = new JFrame("Solver");
        solverUI.setSize(405, 137);
        solverUI.setResizable(false);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        solverUI.setLocation(dim.width/2-solverUI.getSize().width/2, dim.height/2-solverUI.getSize().height/2);
        solverUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel = new JPanel();
        panel.setLayout(new FlowLayout());
        lbl = new JLabel[Count];
        eq_Fields = new JTextField[Count];
        for(int i = 0; i < Count; i++){
            lbl[i] = new JLabel("Equation "+(i+1)+" : ");
            eq_Fields[i] = new JTextField(26);
            panel.add(lbl[i]);
            panel.add(eq_Fields[i]);
        }
        JButton btnSolve = new JButton("Solve Equations!");
        panel.add(btnSolve);
        btnSolve.addActionListener(this);    
                 /*This is the part concerned*/
        JScrollPane jp = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        solverUI.add(jp);    
        solverUI.revalidate();
    }

    public void ShowUserInterface(){
        solverUI.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub          
    }    
}

【问题讨论】:

  • 通常,对于这种问题,您最好插入代码(不是所有,而是您遇到问题的特定代码)。请参阅SSCCE 和此question checklist
  • 很抱歉给您带来不便。帖子已编辑。
  • 试试panel.setPreferredSize(new Dimension(800, 600));
  • 值 800 和 600 不合适,但方法是完美的文件 :) 非常感谢您的帮助。 :)
  • 我强烈反对@Azad 提供的解决方案是正确的方法。如果您要设置组件的大小首选大小,这通常表明 GUI 很差、脆弱。

标签: java swing jframe scrollbar vertical-scrolling


【解决方案1】:

这是一个更明智和可用的 GUI,基于您尝试的结果。看看吧。

import java.awt.*;
import javax.swing.*;

public class SolverUserInterface {

    private JFrame solverUI;
    private JPanel panel;
    private JLabel lbl[];
    private JTextField eq_Fields[];

    public SolverUserInterface(int Count) {
        solverUI = new JFrame("Solver");
        solverUI.setLocationByPlatform(true);
        solverUI.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        panel = new JPanel(new BorderLayout());
        JPanel labels = new JPanel(new GridLayout(0,1,5,5));
        JPanel fields = new JPanel(new GridLayout(0,1,5,5));
        lbl = new JLabel[Count];
        panel.add(labels, BorderLayout.LINE_START);
        panel.add(fields, BorderLayout.CENTER);
        eq_Fields = new JTextField[Count];
        for(int i = 0; i < Count; i++){
            lbl[i] = new JLabel("Equation "+(i+1)+" : ");
            eq_Fields[i] = new JTextField(26);
            labels.add(lbl[i]);
            fields.add(eq_Fields[i]);
        }
        JButton btnSolve = new JButton("Solve Equations!");
        solverUI.add(btnSolve, BorderLayout.PAGE_END);

        JScrollPane jp = new JScrollPane(
            panel,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        solverUI.add(jp);

        solverUI.pack();
        Dimension d = solverUI.getSize();
        int w = (int)d.getWidth();
        int h = (int)d.getHeight();
        h = (h>200 ? 200 : h);
        Dimension shrinkHeight = new Dimension(w,h);
        solverUI.setSize(shrinkHeight);
    }

    public void showUserInterface(){
        solverUI.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                SolverUserInterface sui = new SolverUserInterface(105);
                sui.showUserInterface();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

好的,关于 Pack() 的说明只有一点。当我使用它时,窗口的大小随着字段数量的增加而增长,但当我删除 Pack() 时情况并非如此。使用滚动条时似乎使用 Pack() 没有意义。我对这个结论是否正确?

一点点,但不完全。

  1. 为了可靠地工作,应该对 GUI 进行打包验证。
  2. 封装框架后,它显示为显示组件所需的最小尺寸(除非它比屏幕尺寸更高或更宽)。
  3. ..但是我们可以采用打包后的尺寸,使用它给我们的宽度,并将高度设置得更短。

【讨论】:

  • 我从你的代码中学到了很多关于 java 布局的东西。非常感谢你 Andrew :)
  • 它被称为“嵌套布局”。另请参阅Nested Layout Example,了解有关如何组合布局以创建所需 GUI 的更多想法。
  • 好的,关于 Pack() 的说明只有一点。当我使用它时,窗口的大小随着字段数量的增加而增长,但当我删除 Pack() 时情况并非如此。使用滚动条时似乎使用 Pack() 没有意义。我对这个结论是否正确?
  • 查看编辑以回答(也可以使用编辑后的代码进行演示)。
猜你喜欢
  • 2012-01-02
  • 2013-09-15
  • 2020-11-04
  • 1970-01-01
  • 2013-05-26
  • 2015-05-06
  • 1970-01-01
  • 2011-07-27
  • 2021-11-13
相关资源
最近更新 更多