【问题标题】:Array of JTextField. Alignment in panelJTextField 数组。面板对齐
【发布时间】:2018-04-09 11:57:17
【问题描述】:

你好!我正在尝试定位 JTextField 数组,就像在图片中一样。我选择创建一个数组是因为我想拥有尽可能多的字段。

现在,我遇到的问题是,当我将 JTextFields 放在面板中时,它会将它们垂直放置。

是否也可以在可滚动面板中插入文本字段?

private int nrFields=4;
    private JTextField[] fields = new JTextField[nrFields];
    private JPanel panelNew = new JPanel();

    private void create() { 

        for (JTextField auxField: fields) {
            panelNew.add(auxField=new JTextField(30));
        }   

        JFrame frame = new JFrame("Frame");     
        frame.getContentPane().add(this.panelNew);      
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

编辑:

我设法通过将文本字段放置在面板中来解决问题,在面板上我将布局设置为 boxlayout。接下来我把这个面板放在一个可滚动的面板中,这个面板放在一个新面板中。

private int nrFields=10;
    private JTextField[] fields = new JTextField[nrFields];
    private JPanel panelNew = new JPanel();
    private JScrollPane newScroll = new JScrollPane();      
    private JPanel panelMain = new JPanel();

    private void create() { 
        newScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        panelMain.setLayout(new BoxLayout(panelMain,BoxLayout.Y_AXIS));
        for (int i=0;i<nrFields;i++) {
            panelMain.add(fields[i]=new JTextField(30));            
        }   

        newScroll.setViewportView(panelMain);
        panelNew.add(newScroll);
        JFrame frame = new JFrame("Frame");     
        frame.getContentPane().add(this.panelNew);      
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

【问题讨论】:

  • 请发布一些代码,以便我们知道您尝试了什么。
  • 所以要澄清一下,您希望滚动窗格中心的文本字段数量可变,上方的文本区域保持原位,下方的两个按钮位于左侧和右侧?用户应该怎么做才能使 GUI 变大?我猜应该给滚动窗格更多的高度。宽度呢?按钮之间的空间是否应该增加?文本区域和字段是否应该变宽?
  • 目前我只希望文本字段位于可滚动窗格中,垂直对齐。
  • 提示:添加@Raymo111(或重要的@)以通知新评论的人。

标签: java swing layout-manager


【解决方案1】:

这是(基本上)我会怎么做。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.Random;

public class VerticalTextFields {

    private JComponent ui = null;

    VerticalTextFields() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,20,4,20));

        Random r = new Random();
        int n = 10 + r.nextInt(10);
        JPanel textFieldContainer = new JPanel(new GridLayout(0, 1, 5, 5));
        /*
        While I do not see the point of this array, you may have 
        some purpose for it that is not immediately obvious, so..
        */
        JTextField[] textFieldArray = new JTextField[n];
        for (int ii=0; ii<n; ii++) {
            textFieldArray[ii] = new JTextField("Text field " + (ii+1), 40);
            textFieldContainer.add(textFieldArray[ii]);
        }
        JScrollPane textFieldScrollPane = new JScrollPane(textFieldContainer);
        Dimension d = textFieldContainer.getPreferredSize();
        textFieldScrollPane.getViewport().setPreferredSize(
                new Dimension(d.width, 200));
        ui.add(textFieldScrollPane, BorderLayout.CENTER);
        JPanel textAreaContainer = new JPanel(new FlowLayout());
        textAreaContainer.setBorder(new EmptyBorder(10, 50, 10, 50));
        textAreaContainer.add(new JScrollPane(new JTextArea("Text area", 3, 20)));
        ui.add(textAreaContainer, BorderLayout.PAGE_START);

        JPanel buttonContainer = new JPanel(new BorderLayout());
        buttonContainer.setBorder(new EmptyBorder(10, 10, 10, 10));
        ui.add(buttonContainer, BorderLayout.PAGE_END);
        buttonContainer.add(new JButton("Line Start"), BorderLayout.LINE_START);
        buttonContainer.add(new JButton("Line End"), BorderLayout.LINE_END);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                VerticalTextFields o = new VerticalTextFields();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

【讨论】:

    【解决方案2】:

    您必须使用 JScrollPane。然后调用 setViewportview(Component)。然后只需将 JTextField 放入其中。如果您可以发布一些代码,也许我可以提供更多帮助。 希望对您有所帮助。

    【讨论】:

    • 好的,我试过了。我创建了一个 JScrollPane,我设置了 VerticalScrollBarPolicy,然后我放置在 JTextFields 中。问题在于它将它们放在一起。
    • 确保你的 JScrollPane 有一个布局管理器,类似于 BoxLayout 编辑:这样的东西应该可以工作 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 2013-01-23
    • 2014-12-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2015-07-23
    相关资源
    最近更新 更多