简体   繁体   English

Java Swing:最大化JTable显示

[英]Java Swing: Maximising a JTable display

I currently have a simple java GUI with 2 Jpanels, namely panel1 & panel 2. panel1 is used for image display and labelling display, it works without a problem. 我目前有一个带有2个Jpanel的简单java GUI,即panel1和面板2. panel1用于图像显示和标签显示,它没有问题。

panel 2 is used to display data in a JTable. 面板2用于显示JTable中的数据。 The problem I am having is displaying all data in the table without the vertical scroll pane, as opposed to a section of the table with a scroll pane. 我遇到的问题是在没有垂直滚动窗格的情况下显示表中的所有数据,而不是带有滚动窗格的表的一部分。 This is causing a nasty gap in the GUI and I wish to correct it by displaying all table data at once. 这导致GUI中存在令人讨厌的差距,我希望通过一次显示所有表数据来纠正它。

I have tried using the setPrefferedSize on the panel containing the table, on the table itself and also on the scroll pane, and now im at all loss! 我已经尝试在包含表格的面板上使用setPrefferedSize,在表格本身以及滚动窗格上使用,现在我全神贯注! Any suggestions are most appreciated as always. 任何建议都一如既往地受到赞赏。

import javax.swing.*;
import java.awt.*;
import javax.imageio.*;
import java.io.*;
import java.awt.image.BufferedImage;
import java.util.*;
import javax.swing.table.DefaultTableCellRenderer;

public class GUI2 extends JFrame {

    public int PADDING = 10;
    public GUI2() {

        initUI();
    }

    public final void initUI() {

        // Menu Bar and Menu Items setup
        JMenuBar menuBar;
        JMenu menu;
        JMenuItem menuItem;

        menuBar = new JMenuBar();
        menu = new JMenu("Menu");
        menuBar.add(menu);

        JMenuItem menuNew = new JMenuItem("New");
        menu.add(menuNew);
        JMenuItem menuOpen = new JMenuItem("Open");
        menu.add(menuOpen);
        JMenuItem menuSave = new JMenuItem("Save");
        menu.add(menuSave);
        JMenuItem menuExit = new JMenuItem("Exit");
        menu.add(menuExit);

        setLayout(new GridLayout(4,1));
        setJMenuBar(menuBar);


        JPanel jp1 = new JPanel(new BorderLayout());
        jp1.setBorder(BorderFactory.createEmptyBorder(PADDING, PADDING, PADDING, PADDING));
        jp1.setBorder(BorderFactory.createLineBorder(Color.black));
        jp1.setPreferredSize(new Dimension(800, 300));

        // Create subpanels
        JPanel sp1 = new JPanel();
        JPanel sp2 = new JPanel(new GridLayout(8, 2));
        sp1.setBorder(BorderFactory.createLineBorder(Color.black));

        // Set up sub panel 1
        BufferedImage myPicture = null;
        try{
            myPicture = ImageIO.read(new File("bat.jpg"));
        }catch(IOException e){
            System.out.println("Image not Loaded!");
            e.printStackTrace();
        }

        JLabel picLabel             = new JLabel(new ImageIcon( myPicture ));
        jp1.add(picLabel);


        // For sub panel 2
        JLabel label_location       = new JLabel("Location: ");
        JLabel label_datetime       = new JLabel("Date & Time: ");
        JLabel label_measurementNum = new JLabel("Measurement Number: ");
        JLabel label_vehicleType    = new JLabel("Vehicle Type: ");
        JLabel label_temperature    = new JLabel("Temperature: ");
        JLabel label_weather        = new JLabel("Weather Conditions: ");
        JLabel label_testPersons    = new JLabel("Test Persons: ");
        JLabel label_testType       = new JLabel("Test Type: ");

        String timestamp            = " ";
        Date date                   = new Date();
        timestamp                   = date.toString();


        JTextField  location        = new JTextField();
        JLabel      datetime        = new JLabel(timestamp);
        JLabel      measurementNum  = new JLabel("AZUWADA87623Q");          
        JLabel      vehicleType     = new JLabel("Batmobile");                   
        JTextField  temperature     = new JTextField(); 
        JTextField  weather         = new JTextField();
        JTextField  testPersons     = new JTextField();
        JTextField  testType        = new JTextField();



        sp1.add(picLabel);
        sp2.add(label_location);
        sp2.add(location);
        sp2.add(label_datetime);
        sp2.add(datetime);
        sp2.add(label_measurementNum);
        sp2.add(measurementNum);
        sp2.add(label_vehicleType);
        sp2.add(vehicleType);
        sp2.add(label_temperature);
        sp2.add(temperature);
        sp2.add(label_weather);
        sp2.add(weather);
        sp2.add(label_testPersons);
        sp2.add(testPersons);
        sp2.add(label_testType);
        sp2.add(testType);



        label_location.setHorizontalAlignment(SwingConstants.LEFT);                         



        jp1.add(sp1, BorderLayout.WEST);
        jp1.add(sp2, BorderLayout.EAST);

        add(jp1);



        JPanel jp2 = new JPanel();
        jp2.setPreferredSize(new Dimension(900, 900));


        String[] columnNames = {"", "DAW Referernce Scale", " WIM Vehicle 1"}; 
        Object[][] data = { {"Vehicle Summary", new Integer(100), new Integer(200)},  // Header 1: Green
                            {"Axle Numbers", new Integer(100), new Integer(200)},
                            {"Axle Code", new Integer(100), new Integer(200)},
                            {"Axle Distances (cm)", new Integer(100), new Integer(200)},
                            {"Vehicle Speed (km/h)", new Integer(100), new Integer(200)},
                            {"Gross Weight", new Integer(100), new Integer(200)}, 
                            {"Axle Weight 1", new Integer(100), new Integer(200)},
                            {"Axle Weight 2", new Integer(100), new Integer(200)},

                            // Measurements for Axle 1
                            // Weights
                            {"Axle 1", new Integer(100), new Integer(200)},   // Header 1: Green
                            {"Weights (kg)", " ", " "},
                            {"Axle Weights AW1", new Integer(100), new Integer(200)},
                            {"Wheel Weights WW1R", new Integer(100), new Integer(200)},
                            {"Wheel Weights WW1L", new Integer(100), new Integer(200)},
                            // Dimensions
                            {"Dimensions (cm or cm2)", new Integer(100), new Integer(200)},
                            {"Axle Width AW1", new Integer(100), new Integer(200), new Integer(200)}, 
                            {"Tire Footprints 1R Length", new Integer(100), new Integer(200)},
                            {"Tire Footprints 1R Width", new Integer(100), new Integer(200)},
                            {"Tire Footprints 1R FootPrint", new Integer(100), new Integer(200)},
                            {"Tire Footprints 1L Length", new Integer(100), new Integer(200)},
                            {"Tire Footprints 1L Width", new Integer(100), new Integer(200)},
                            {"Tire Footprints 1L FootPrint", new Integer(100), new Integer(200)},
                            // Speed
                            {"Speed", " ", " "},
                            {"Vehicle Speed", new Integer(100), new Integer(200)},
                            {"Axle Speed", new Integer(100), new Integer(200)},
                            {"Tyre Speed 1R", new Integer(100), new Integer(200)},
                            {"Tyre Speed 1L", new Integer(100), new Integer(200)},

                            // Measurements for Axle 2
                            // Weights
                            {"Axle 2", " ", " "},   // Header 1: Green
                            {"Weights (kg)", " ", " "},
                            {"Axle Weights AW2", new Integer(100), new Integer(200)},
                            {"Wheel Weights WW2R", new Integer(100), new Integer(200)},
                            {"Wheel Weights WW2L", new Integer(100), new Integer(200)},
                            // Dimensions
                            {"Dimensions (cm or cm2)", " ", " "},
                            {"Axle Width AW2", new Integer(100), new Integer(200)}, 
                            {"Tire Footprints 2R Length", new Integer(100), new Integer(200)},
                            {"Tire Footprints 2R Width", new Integer(100), new Integer(200)},
                            {"Tire Footprints 2R FootPrint", new Integer(100), new Integer(200)},
                            {"Tire Footprints 2L Length", new Integer(100), new Integer(200)},
                            {"Tire Footprints 2L Width", new Integer(100), new Integer(200)},
                            {"Tire Footprints 2L FootPrint", new Integer(100), new Integer(200)},
                            // Speed
                            {"Speed", " ", " "},
                            {"Vehicle Speed", new Integer(100), new Integer(200)},
                            {"Axle Speed", new Integer(100), new Integer(200)},
                            {"Tyre Speed 2R", new Integer(100), new Integer(200)},
                            {"Tyre Speed 2L", new Integer(100), new Integer(200)},};


        final JTable table = new JTable(data, columnNames); 

        table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
        table.setFillsViewportHeight(true); 

        JScrollPane scrollPane = new JScrollPane(table); 

        jp2.add(scrollPane);
        add(scrollPane);


        setSize(400,300);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

    }

            //Custom Renderer - does the default rendering except if told the row should be a different color
    public static class CustomRenderer extends DefaultTableCellRenderer{

        public CustomRenderer(){
            super();
            //Customize the rendering however you want
            setBackground(UIManager.getColor("TableHeader.background"));
        }
    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception e) {
                    e.printStackTrace();
                }

                GUI2 ex = new GUI2();
                ex.setVisible(true);
            }
        });
    }
}

If I understand correctly you want to make JTable stretch vertical to take all free space below top panel. 如果我理解正确,你想让JTable拉伸垂直以占据顶部面板下面的所有空闲空间。 If so you need to change layout manager. 如果是这样,您需要更改布局管理器。 Now you use Gridlayout with 4 rows. 现在你使用4行Gridlayout。 GridLayout split up you frame to 4 vertical blocks with equal heights . GridLayout将您的帧分割为4个具有相同高度的垂直块。 First block contains top panel - jp1 , second block contains JScrollPane with JTable and two bottom blocks are empty, but take a half of frame height. 第一个块包含顶部面板 - jp1 ,第二个块包含带有JTable JScrollPane ,两个底部块是空的,但占用帧高的一半。

You can try to use BoxLayout, BorderLayout or GridBagLayout. 您可以尝试使用BoxLayout,BorderLayout或GridBagLayout。

JTable does not provide scrolling ability itself. JTable本身不提供滚动功能。 This is typically implemented using JScrollPane . 这通常使用JScrollPane实现。 Try to create JScrollPane , put it onto your panel and put JTable into JScrollPane . 尝试创建JScrollPane ,将其放到面板上并将JTable放入JScrollPane Take a look on scrolling policy. 看看滚动策略。 You can control it using constructor or various methods of JScrollPane . 您可以使用构造函数或JScrollPane各种方法来控制它。 For example the scroll bar may appear always or automatically only if it is needed etc. 例如,滚动条可能只在需要时才会显示或自动显示。

It looks pretty good with a few changes. 一些变化看起来很不错。

  • Use setLayout(new GridLayout(0, 1)) to add only as many rows as needed. 使用setLayout(new GridLayout(0, 1))仅根据需要添加setLayout(new GridLayout(0, 1))行。
  • Don't setPreferredSize() on jp1 and jp2 ; 不要在jp1jp2jp1 setPreferredSize() ; the components know how big they are. 组件知道它们有多大。
  • Call pack() on the window right before setVisible(true) . setVisible(true)之前的窗口上调用pack() setVisible(true)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM