JScrollPane в JPanel не се показва


Имам следния сценарий: JFrame, който съдържа няколко JPanels, които са избрани с помощта на CardLayout. Един JPanel съдържа доста голяма JTable, която увих в JScrollPane и добавих JScrollPane към основния JPanel:

package com.javaswingcomponents.demo;

import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;

import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class MyPanel extends JPanel {

    private DefaultTableModel model = new DefaultTableModel();

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.setVisible(true);
                    frame.setBounds(100, 100, 450, 535);
                    frame.getContentPane().add(new MyPanel());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MyPanel() {

        JTable table = new JTable(model);

        JScrollPane scrollPaneParte = new JScrollPane(table);
        scrollPaneParte.setPreferredSize(new Dimension(600, 600));

        scrollPaneParte.setBounds(10, 92, 867, 92);
        add(scrollPaneParte);
        scrollPaneParte.setViewportView(table);

        addColumns(model);


    }

    public  void addColumns(DefaultTableModel model) {
        for (int ii=0;ii<10;ii++)
        model.addColumn("Field"+ii);  
    }
}

Първоначално си помислих, че проблемът е в използваното XY (нулево) оформление, но дори при промяна на BorderLayout нищо не се случва, тоест ScrollBar не се показва и се показва само част от JTable.

Някаква идея как да се реши този проблем?

РЕДАКТИРАНЕ: Включих пълен работещ пример, който възпроизвежда проблема.


person user2824073    schedule 23.10.2014    source източник
comment
1) За по-добра помощ по-рано, публикувайте MCVE (минимален пълен пример за проверка). 2) Графичните потребителски интерфейси на Java трябва да работят на различни операционни системи, размери на екрана, разделителна способност на екрана и т.н. Като такива те не са благоприятни за перфектно пикселно оформление. Вместо това използвайте мениджъри за оформление или комбинации от тях заедно с подложка за оформление и граници за празно пространство. 3) Вижте Трябва ли да избягвам използването на методите set(Preferred|Maximum|Minimum)Size в Java Swing? (Да.)   -  person Andrew Thompson    schedule 23.10.2014
comment
Добре благодаря. Включих основната част от класа, за да може да се провери.   -  person user2824073    schedule 23.10.2014


Отговори (1)


Този вариант работи надеждно. Имайте предвид, че оформлението по подразбиране на панел е оформление на потока. Ако GUI стане твърде малък за компонентите в оформлението на потока, те ще бъдат съкратени, както във вашия пример. Бих склонен да променя оформлението на оформлението на мрежата, което решава проблема в известен смисъл. Но в този пример следваме най-добрите практики за задаване на размери (и местоположения) и налагаме минималния размер.

import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class MyPanel extends JPanel {

    private DefaultTableModel model = new DefaultTableModel();

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.setLocationByPlatform(true);

                    frame.getContentPane().add(new MyPanel());

                    frame.pack();
                    frame.setMinimumSize(frame.getSize());
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public MyPanel() {
        addColumns(model);
        JTable table = new JTable(model);
        JScrollPane scrollPaneParte = new JScrollPane(table);
        add(scrollPaneParte);
    }

    public  void addColumns(DefaultTableModel model) {
        for (int ii=0;ii<10;ii++)
        model.addColumn("Field"+ii);  
    }
}
person Andrew Thompson    schedule 23.10.2014
comment
Благодаря за варианта на кода. Виждам, че налага размера на рамката до минимален размер, така че в много случаи това е добро решение. От друга страна, ScrollBar все още не се появява и това е проблем за мен, тъй като всяка колона съдържа големи клетъчни данни, така че ще завърши с много голяма ширина на рамката, мисля. - person user2824073; 23.10.2014