2013-06-27 4 views
1

Я пишу простое приложение, решение системы уравнений. Основная идея заключается в том, чтобы получить количество переменных в системе от пользователя и создать динамическое сопровождение многих JTextFields с помощью кнопки для решения системы.Создание вертикальной прокрутки JFrame с FLowLayout

В своем стремлении достичь этого я изо всех сил стараюсь установить вертикальную полосу прокрутки.

Что происходит, макет становится все испорченным после использования JScrollPane.

Я использовал this в качестве проводника и попытался сделать это таким образом, с VERTICAL_ALWAYS AND 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 (новый размер (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() не имеет смысла при использовании полосы прокрутки. Правильно ли я с этим выводом?

Немного, но не полностью.

  1. Для работы надежно, графический интерфейс должен быть упакован или подтверждено.
  2. После того, как кадр упакован, он отображается как минимальный размер, необходимый для отображения компонентов (если он не выше или шире размера экрана).
  3. .. но тогда мы можем взять упакованный размер, использовать ширину, которую он дает нам, и установить высоту короче.
+1

+1 от меня, я полностью согласен, спасибо. – Azad

+0

Да! Thanx :) подсказка от Azad ранее также работала :) – Priyabrata

+0

Я узнал немало вещей о java-макетах из вашего кода .. Большое спасибо Andrew :) – Priyabrata