Как использовать 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);
Другие вопросы по тегам