2013-04-28 7 views
1

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

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

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

CatalogPane:

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!"); 
    } 

} 
} 

BookFrame:

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); 

} 
} 
+1

Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). –

+0

Кажется, что проблема макета. Попробуйте использовать 'gbl' в качестве макета' bookDisplay'. Затем в 'addComponent' удалите вызов' setConstraints' и замените строку ниже на 'bookDisplay.add (c, gbc);' и посмотрите, поможет ли это. – kuporific

+0

На самом деле, поскольку 'bookDisplay' использует' GridBagLayout', везде, где вы называете 'bookDisplay.add', вам нужно использовать' GridBagConstraints' – kuporific

ответ

3

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

test image

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(); 
      } 
     }); 
    } 
} 
+0

Эй, бесплатная книга! – trashgod

+0

Таблица работает, но я пытаюсь получить первый столбец для загрузки изображений, но я не могу заставить его отображаться. Как поставить таблицу, чтобы загрузить JLabel с ImageIcon? –

+0

Используйте 'ImageIcon' в' addRow() 'и соответствующим образом обновите класс столбца; как указано в учебнике, он будет «вынесен с помощью центрированного ярлыка». – trashgod

Смежные вопросы