【问题标题】:Building GUI with ArrayList<JPanel>使用 ArrayList<JPanel> 构建 GUI
【发布时间】:2016-10-23 16:01:59
【问题描述】:

我正在用 Java 开发应用程序以进行测试(出于学习目的)。花了半天时间才想通连接到 Firebird DB。 现在我在构建 GUI 时遇到了问题。这是我的代码:

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

public class ExamSettingsWindow extends JFrame {
    JDialog examSettingsWindow = new JDialog(MainWindow.mainWindow, "Редагування екзамену", true);
    JPanel mainPanel = new JPanel();

    ArrayList<Question> questionsList = new ArrayList<Question>(Question.getQuestions());
    ArrayList<JPanel> qaPanels = new ArrayList<JPanel>();



    ExamSettingsWindow() {
        for(Question q : questionsList)
        {  // Some weird shit happenning in this loop, can't explain this, but i'm sure it will work someday...
            JLabel qID = new JLabel(String.valueOf(q.getID()));
            qID.setBorder(new EmptyBorder(2,2,2,2));
            JLabel qText = new JLabel(q.getText());
            qText.setBorder(new EmptyBorder(2,2,2,2));
            JPanel qPanel = new JPanel();
            qPanel.setLayout(new BoxLayout(qPanel, BoxLayout.X_AXIS));
            qPanel.setBorder(new EmptyBorder(5,5,5,5));
            qPanel.setMinimumSize(new Dimension(500,30));
            qPanel.add(qID);
            qPanel.add(qText);

            JPanel aPanels = new JPanel();
            aPanels.setLayout(new BoxLayout(aPanels, BoxLayout.Y_AXIS));
            aPanels.setBorder(new EmptyBorder(5,5,5,5));
            aPanels.setMinimumSize(new Dimension(500,30));

            for (Question.Answer a : q.answersList) {
                JLabel aID = new JLabel(a.getID());
                aID.setBorder(new EmptyBorder(2,2,2,2));
                JLabel aText = new JLabel(a.getText());
                aText.setBorder(new EmptyBorder(2,2,2,2));
                JPanel aPanel = new JPanel();
                aPanel.setMinimumSize(new Dimension(500,30));
                aPanel.setLayout(new BoxLayout(aPanel, BoxLayout.X_AXIS));
                aPanel.add(aID);
                aPanel.add(aText);

                aPanels.add(aPanel);
            }

            JPanel qaPanel = new JPanel();
            qaPanel.setMinimumSize(new Dimension(500,200));
            qaPanel.setLayout(new BoxLayout(qaPanel, BoxLayout.Y_AXIS));
            qaPanel.setBorder(new TitledBorder(new LineBorder(Color.black, 2),
                    "Питання "+String.valueOf(q.getID())));

            qaPanels.add(qaPanel);
        }

        examSettingsWindow.setMinimumSize(new Dimension(500, 500));
        examSettingsWindow.setMaximumSize(new Dimension(500, 500));
        examSettingsWindow.setResizable(false);
        examSettingsWindow.setDefaultCloseOperation(HIDE_ON_CLOSE);
        examSettingsWindow.setLocationRelativeTo(null);

        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
        mainPanel.setMinimumSize(new Dimension(500,500));
        for (JPanel p : qaPanels) {
            mainPanel.add(p);
        }
        JScrollPane sc = new JScrollPane(mainPanel);
        sc.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        examSettingsWindow.add(mainPanel);
    }

    public void initExamSettingsFrame(boolean vision) {
        examSettingsWindow.setVisible(vision);
    }
}

这是运行程序后显示的图片: >>click<<

我认为问题可能出在包含具有相同名称的 JPanel 的 ArrayList 中,但我不确定,当我在寻找原因和解决方案时,我的脑袋正在爆炸。 请帮助...给我正确的方向...

附:我的代码并不完美,不要怪我。我只是想学习Java。

【问题讨论】:

标签: java swing user-interface arraylist


【解决方案1】:

您可能已将问题面板和答案面板添加到 qaPanel

qaPanel.add(qPanel);
qaPanel.add(aPanels);

然后 UI 显示问题和答案。

我所做的另一项更改是将 mainPanel 的布局从 BoxLayout 更改为 GridLayout。这给了我以下结果。

mainPanel.setLayout(new GridLayout(qaPanels.size(),1));//Optional change

【讨论】:

  • 是的,我错过了向面板添加组件...非常感谢:)
  • @ViacheslavZhabonos 太棒了。希望你能接受我的回答。 ;-)
  • 我刚刚按下“接受”按钮...您看到一些变化吗?它是正确的按钮吗?
  • P.S.但我还是很好奇。我构建 GUI 的方法是否正确?我应该保留它吗?
  • 我觉得很好。如果不知道您要完成什么,我可能无法准确说出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多