有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JPanel中的java JScrollPane未显示


我有以下场景:一个JFrame,其中包含几个使用CardLayout选择的JPanel。一个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(null)布局,但即使更改为BorderLayout,也不会发生任何变化,即不显示滚动条,只显示JTable的一部分

你知道如何解决这个问题吗

编辑:我已经包括了一个完整的工作示例,它再现了这个问题


共 (1) 个答案

  1. # 1 楼答案

    这种变体工作可靠。请注意,面板的默认布局是flow布局。如果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);  
        }
    }