2016-06-21 37 views
1

我正在開發用於測試(用於研究目的)的Java應用程序。花了一半的時間,直到連接到Firebird數據庫。 現在我在構建GUI時遇到了問題。這裏是我的代碼:使用ArrayList構建GUI <JPanel>

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

我想問題可能是ArrayList中包含的JPanel具有相同的名字,但我不知道當我尋找原因和解決方案時,我的頭腦正在炸燬。 請幫助...給我正確的方向...

P.S.我的代碼不完美,不要責怪我。我只是想學習Java。

+1

1)爲了更好地幫助越早,張貼[MCVE]或[簡要,獨立的,正確的示例](http://www.sscce.org/)。 (該代碼至少需要一個'main(String [])'方法才能成爲一個MCVE/SSCCE。)2)以最小尺寸提供ASCII藝術或簡單的GUI佈局圖,如果可調整大小,更寬和更高。 3)請參閱[我是否應避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法?](http://stackoverflow.com/q/7229226/418556)(是) –

+0

謝謝,我將遵循你將來的推薦。 –

回答

3

您可能需要添加問題面板和回答面板qaPanel

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

然後UI中顯示的問題和答案。

我做的一個更改是將mainPanel的佈局從BoxLayout更改爲GridLayout。這給了我下面的結果。

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

enter image description here

+0

是的,我錯過了向面板添加組件......非常感謝:) –

+0

@ViacheslavZhabonos太棒了。希望你能接受我的答案。 ;-) – Beniton

+0

我只是按下「接受」按鈕...你看到一些變化?這是一個正確的按鈕? –