JScrollPane внутри JPanel внутри JTabbedPane не прокручивается

У меня есть JPanel под названием CatalogPane размером 800 на 600, который находится внутри JTabbedPane внутри JFrame с именем BookFrame. Итак, внутри CatalogPane я создал JPanel с именем bookDisplay, который отображает список книг и их детали. Я хочу, чтобы он был размером 780 на 900, оставляя 20 пикселей для полосы прокрутки и выше фрейма, чтобы он мог прокручиваться. Затем я создал панель размером 800 на 400, потому что мне нужно оставить дополнительное пространство внизу для других полей. Я попытался создать JScrollPane для bookDisplay, а затем поместить его в другую панель, но каким-то образом полоса прокрутки появляется, но ее нельзя использовать для прокрутки. Я экспериментировал с изменением размеров и области прокрутки, но все еще не могу заставить его работать.

Как это выглядит: http://prntscr.com/12j0d9

Полоса прокрутки есть, но не работает. Я пытаюсь заставить полосу прокрутки работать, прежде чем правильно отформатировать макет.

КаталогПанель:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;

public class CatalogPane extends JPanel{
//private Order currOrder = new Order();
//ArrayList<Book> bookCatalog = new ArrayList();
GridBagConstraints gbc = new GridBagConstraints();
GridBagLayout gbl = new GridBagLayout();
JPanel bookDisplay = new JPanel();

public CatalogPane()
{
    //loadBookCatalog();

    this.setPreferredSize(new Dimension(800, 600));
    bookDisplay.setPreferredSize(new Dimension(780, 900));

    bookDisplay.setLayout(new GridLayout(6, 5));

    //bookDisplay.setLayout(gbl);
    //gbc.fill = GridBagConstraints.NONE;
    //gbc.weightx = 1;
    //gbc.weighty = 1;

    JLabel bookL = new JLabel("Books");
    JLabel hardL = new JLabel("Hardcopy");
    JLabel hardQuantL = new JLabel("Quantity");
    JLabel eL = new JLabel("EBook");
    JLabel eQuantL = new JLabel("Quantity");

    bookDisplay.add(bookL);
    bookDisplay.add(hardL);
    bookDisplay.add(hardQuantL);
    bookDisplay.add(eL);
    bookDisplay.add(eQuantL);

    /*
    addComponent(bookL, 0, 0, 1, 1);
    addComponent(hardL, 0, 1, 1, 1);
    addComponent(hardQuantL, 0, 2, 1, 1);
    addComponent(eL, 0, 3, 1, 1);
    addComponent(eQuantL, 0, 4, 1, 1);
    */

    Iterator<Book> bci = bookCatalog.iterator();
    int row = 1;
    /*
    while(bci.hasNext())
    {
        Book temp = bci.next();
        ImageIcon book1 = new ImageIcon(temp.getImage());
        JLabel image = new JLabel(temp.getTitle(), book1, JLabel.CENTER);
        image.setVerticalTextPosition(JLabel.TOP);
        image.setHorizontalTextPosition(JLabel.CENTER);
        String[] quant = {"1", "2", "3", "4", "5"};
        JLabel hardP = new JLabel("$" + temp.getHardPrice());
        JLabel eP = new JLabel("$" + temp.getEPrice());
        JComboBox jbc1 = new JComboBox(quant);
        JComboBox jbc2 = new JComboBox(quant);
        jbc1.setSelectedIndex(0);
        jbc2.setSelectedIndex(0);

        /*
        addComponent(b1temp, row, 0, 1, 1);
        addComponent(hardP, row, 1, 1, 1);
        addComponent(jbc1, row, 2, 1, 1);
        addComponent(eP, row, 3, 1, 1);
        addComponent(jbc2, row, 4, 1, 1);
        row++;

        bookDisplay.add(image);
        bookDisplay.add(new JLabel("$" + temp.getHardPrice()));
        bookDisplay.add(jbc1);
        bookDisplay.add(new JLabel("$" + temp.getEPrice()));
        bookDisplay.add(jbc2);
    */


    for(int i=0;i<5;i++)
    {
        String[] quant = {"1", "2", "3", "4", "5"};
        JComboBox jbc1 = new JComboBox(quant);
        JComboBox jbc2 = new JComboBox(quant);
        jbc1.setSelectedIndex(0);
        jbc2.setSelectedIndex(0);
        JLabel image = new JLabel("image");
        bookDisplay.add(image);
        bookDisplay.add(new JLabel("$" + 20));
        bookDisplay.add(jbc1);
        bookDisplay.add(new JLabel("$" + 15));
        bookDisplay.add(jbc2);
    }

    JScrollPane vertical = new JScrollPane(bookDisplay);
    //JPanel testP = new JPanel();
    //testP.setPreferredSize(new Dimension(800, 400));
    //JScrollPane vertical = new JScrollPane(testP);
    //testP.add(bookDisplay);
    vertical.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    JPanel testP = new JPanel();
    testP.setPreferredSize(new Dimension(800, 400));
    testP.add(vertical);
    add(testP);
}

public void addComponent(Component c, int row, int col, int hei, int wid)
{
    gbc.gridx = col;
    gbc.gridy = row;
    gbc.gridwidth = wid;
    gbc.gridheight = hei;
    gbl.setConstraints(c, gbc);
    bookDisplay.add(c);
}

public Order getCurrOrder()
{
    return currOrder;
}

private void loadBookCatalog()
{
    try
    {
        String[] str = new String[8];
        Scanner sc = new Scanner(new File("bookcat.txt"));
        double temp1, temp2;

        while(sc.hasNextLine())
        {
            str = sc.nextLine().split(";");
            temp1 = Double.parseDouble(str[3]);
            temp2 = Double.parseDouble(str[4]);
            Book temp = new Book(temp1, temp2, str[0], str[1], str[2], str[5]);
            bookCatalog.add(temp);
        } 
    }
    catch(IOException e)
    {
        System.out.println("File not found!");
    }

}
}

КнигаРамка:

public class BookFrame extends JFrame{
JButton closeButton;
CatalogPane cp;
//IntroPane ip;

public BookFrame(String name)
{
    super(name);
    this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    this.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e)
        {
            JOptionPane.showMessageDialog(JOptionPane.getFrameForComponent(new IntroPane()),
                "Thank you for visiting Groovy Book Company.", "Message", 
                JOptionPane.INFORMATION_MESSAGE, new ImageIcon("coffee.jpg"));
            System.exit(0);
        }
    });

    //ip = new IntroPane();
    cp = new CatalogPane();
    JTabbedPane jtp = new JTabbedPane();
    jtp.setPreferredSize(new Dimension(800, 600));

    //jtp.addTab("Intro", ip);
    jtp.addTab("Catalog", cp);
    add(jtp);
    pack();
    setVisible(true);

}
}

person Jary Rym    schedule 28.04.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 28.04.2013
comment
Похоже на проблему макета. Попробуйте использовать gbl в качестве макета bookDisplay. Затем в addComponent удалите вызов setConstraints и замените строку ниже на bookDisplay.add(c, gbc); и посмотрите, поможет ли это.   -  person kuporific    schedule 28.04.2013
comment
На самом деле, поскольку bookDisplay использует GridBagLayout, везде, где вы вызываете bookDisplay.add, вам нужно использовать GridBagConstraints   -  person kuporific    schedule 28.04.2013


Ответы (1)


Я бы посмотрел на JTable, который обрабатывает прокрутку и рендеринг как показано здесь и ниже. В этом примере показано, как визуализировать изображения и валюту. Начните с добавления третьего столбца для количества типа Integer. Этот связанный пример иллюстрирует использование редактора JComboBox.

тестовое изображение

import java.awt.Dimension;
import java.awt.EventQueue;
import java.text.NumberFormat;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

/**
 * @see https://stackoverflow.com/a/16264880/230513
 */
public class Test {

    public static final Icon ICON = UIManager.getIcon("html.pendingImage");

    private JPanel createPanel() {
        JPanel panel = new JPanel();
        DefaultTableModel model = new DefaultTableModel() {
            @Override
            public Class<?> getColumnClass(int col) {
                if (col == 0) {
                    return Icon.class;
                } else {
                    return Double.class;
                }
            }
        };
        model.setColumnIdentifiers(new Object[]{"Book", "Cost"});
        for (int i = 0; i < 42; i++) {
            model.addRow(new Object[]{ICON, Double.valueOf(i)});
        }
        JTable table = new JTable(model);
        table.setDefaultRenderer(Double.class, new DefaultTableCellRenderer() {
            @Override
            protected void setValue(Object value) {
                NumberFormat format = NumberFormat.getCurrencyInstance();
                setText((value == null) ? "" : format.format(value));
            }
        });
        table.setRowHeight(ICON.getIconHeight());
        panel.add(new JScrollPane(table) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 240);
            }
        });
        return panel;
    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane jtp = new JTabbedPane();
        jtp.addTab("Test1", createPanel());
        jtp.addTab("Test2", createPanel());
        f.add(jtp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
person trashgod    schedule 28.04.2013
comment
Таблица работает, но я пытаюсь заставить первый столбец загружать изображения, но я не могу заставить его появиться. Как заставить таблицу загружать JLabel с помощью ImageIcon? - person Jary Rym; 29.04.2013
comment
Используйте ImageIcon в addRow() и соответствующим образом обновите класс столбца; как указано в учебнике, он будет отображаться с помощью метки по центру. - person trashgod; 29.04.2013