[英]Making a vertical scrolling JFrame with FLowLayout
我正在編寫一個簡單的應用程序,一個方程系統求解器。 它背后的基本思想是從用戶獲取系統中的變量數量,並動態創建許多JTextFields后跟一個按鈕來解決系統問題。
在我努力實現它的過程中,我正在努力設置垂直滾動條。
會發生什么,在使用JScrollPane之后,布局會全部搞砸。
我已經使用它作為指南並嘗試這樣做,使用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
}
}
這是一個更合理和可用的GUI,基於您嘗試的方式。 仔細看看。
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()時則不是這樣。 看起來使用Pack()在使用滾動條時沒有意義。我對此結論是否正確?
一點點,但不完全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.