Как использовать JScrollPane
Я пытаюсь создать простое бюджетное приложение, используя набор инструментов Java Swing. Приложение должно попросить пользователя ввести статью бюджета и цену этого элемента в двух полях JTextFields. Он будет хранить информацию в двух списках ArrayList для последующего вывода в текстовый документ. Каждый раз, когда пользователь вводит элемент и цену (нажав кнопку "Ok"), создаются два новых JTextFields и одна новая кнопка "Ok" для хранения другого элемента и его цены.
Моя проблема в том, что я хочу, чтобы пользователь мог вводить столько статей бюджета, сколько ему нужно. В настоящее время, когда пользователь добавляет много элементов, поля JTextFields исчезают из поля зрения. Я считаю, что решение было бы добавить какой-то механизм прокрутки, но у меня возникли проблемы с добавлением JScrollPane. У кого-нибудь с таким опытом есть решение этой проблемы?
Я был бы очень признателен за любую помощь.
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;
public class Budget3 {
private JFrame frame;
private ArrayList<String> itemList = new ArrayList<String>();
private ArrayList<Double> priceList = new ArrayList<Double>();
private double totalPrice = 0;
private int okCount = 0;
private DecimalFormat f = new DecimalFormat("$##,##0.00");
private JLabel itemTitleLabel;
private JLabel priceTotal;
public static void main(String[] args){
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Budget3 window = new Budget3();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Budget3() {
initialize();
}
public void initialize(){
frame = new JFrame();
frame.setBounds(100,100,800,800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JLabel titleLabel = new JLabel("BUDGET");
titleLabel.setBounds(330,16,125,48);
frame.getContentPane().add(titleLabel);
titleLabel.setFont(new Font("Tahoma", Font.BOLD, 30));
itemTitleLabel = new JLabel("Item (" + itemList.size() + ")");
itemTitleLabel.setFont(new Font("Tahoma", Font.PLAIN, 25));
itemTitleLabel.setBounds(49, 117, 151, 37);
frame.getContentPane().add(itemTitleLabel);
JLabel priceTitleLabel = new JLabel("Price");
priceTitleLabel.setFont(new Font("Tahoma", Font.PLAIN, 25));
priceTitleLabel.setBounds(225, 117, 69, 37);
frame.getContentPane().add(priceTitleLabel);
priceTotal = new JLabel("Total: " + f.format(totalPrice));
priceTotal.setFont(new Font("Tahoma", Font.PLAIN, 25));
priceTotal.setBounds(450, 117, 274, 37);
frame.getContentPane().add(priceTotal);
addItem();
}
int textFieldCount = 0;
public void addItem(){
int labelY = 180 + okCount*30;
JTextField itemField = new JTextField();
frame.getContentPane().add(itemField);
itemField.setBounds(50, labelY, 150, 30);
itemField.setColumns(10);
JTextField priceField = new JTextField();
textFieldCount++;
frame.getContentPane().add(priceField);
priceField.setBounds(225, labelY, 150, 30);
priceField.setColumns(10);
JButton okButton = new JButton("OK");
okButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int buttonY = okButton.getY();
int spotCount = (buttonY - 180) / 30;
try{
itemList.remove(spotCount);
priceList.remove(spotCount);
} catch (IndexOutOfBoundsException bounds){}
String item = itemField.getText();
String priceString = priceField.getText();
double price = Double.parseDouble(priceString);
itemList.add(spotCount, item);
priceList.add(spotCount, price);
totalPrice = 0;
for(int i = 0; i < priceList.size(); i++){
totalPrice = totalPrice + priceList.get(i);
}
if(itemList.size() < 2){
itemTitleLabel.setText("Item (" + itemList.size() + ")");
}
else{
itemTitleLabel.setText("Items (" + itemList.size() + ")");
}
priceTotal.setText("Total: " + f.format(totalPrice));
if(itemList.size() == textFieldCount)
{
okCount++;
addItem();
}
}
});
frame.getContentPane().add(okButton);
okButton.setBounds(450,labelY,62,30);
frame.revalidate();
frame.repaint();
}
}
1 ответ
// Create a JScrollBar with all default properties. Its orientation
// will be vertical, current value 0, extent 10, minimum 0, and maximum
// 100
JScrollBar sb1 = new JScrollBar();
// Create a horizontal JScrollBar with default values
JScrollBar sb2 = new JScrollBar(JScrollBar.HORIZONTAL);
// Create a horizontal JScrollBar with a current value of 50,
// extent 15, minimum 1 and maximum 150
JScrollBar sb3 = new JScrollBar(JScrollBar.HORIZONTAL, 50, 15, 1,150);
// Create a JScrollPane with no component as its viewport and
// with default scrollbars policy as "As Needed"
JScrollPane sp1 = new JScrollPane();
// Create a JScrollPane with a JTextArea as its viewport and
// with default scrollbars policy as "As Needed"
JTextArea description = new JTextArea(10, 60);
JScrollPane sp2 = new JScrollPane(description);
// Create a JScrollPane with a JTextArea as its viewport and
// both scrollbars policy set to "show always"
JTextArea comments = new JTextArea(10, 60);
JScrollPane sp3 = new JScrollPane(comments,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);