2013-06-27 71 views
1

我正在寫一個簡單的應用程序,一個方程式系統求解器。 它背後的基本思想是從用戶獲取系統中的變量數量,並創建許多JTextFields動態地跟隨一個按鈕來解決系統。使用FLowLayout製作垂直滾動JFrame

在努力實現它的同時,我正在努力設置垂直滾動條。

會發生什麼情況,在使用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   
    }  
} 
+1

通常,在這類問題中,最好插入代碼(並非所有代碼都是特定的代碼)。 請參閱[SSCCE](http://sscce.org/)和本[問題清單](http://msmvps.com/blogs/jon_skeet/archive/2012/11/24/stack-overflow-question-checklist的.aspx)。 – Azad

+0

抱歉給您帶來不便。發佈編輯。 – Priyabrata

+0

試試'panel.setPreferredSize(new Dimension(800,600));' – Azad

回答

3

這是一個更明智和可用的圖形用戶界面,基於你似乎嘗試的東西。看看它。

Solver User Interface

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()在使用滾動條時沒有意義。我是否正確地得出了這個結論?

有點但不完全。

  1. 爲了可靠地工作,GUI應該被打包驗證。
  2. 打包一個框後,它會顯示爲顯示組件所需的最小尺寸(除非它比屏幕尺寸更高或更寬)。
  3. ..但是,我們可以採取包裝尺寸,使用它給我們的寬度,並將高度設置得更短。
+1

從我+1,我完全同意,謝謝。 – Azad

+0

是的! Thanx :)由Azad早期給出的提示也工作:) – Priyabrata

+0

我從你的代碼中學到了很多關於java佈局的東西。非常感謝Andrew :) – Priyabrata