在附件的截图中,我有一个JLabel,JTextField和一个包装在JSchrollPane中的JTabel.首先,JLabelJTextField在中间漂浮得太远了.上面有很大的空间.我想关闭那个空间.其次,我想让JTable/JSchrollPane填满整个宽度.它只占宽度的一半.并且它不会显示该表包含的3行.

如果我这样做,而不是panFindStudent.add(table, gbcFindStud);行显示,但它仍然看起来不漂亮.我想使用JSchrollPane,这样,如果表包含许多行/列,则可以执行Schroll

我还try 将JLabelJTexField包装在JPanel中,并将JSchrollPane包装在另一个JPanel中,然后将这2个JPanels分别添加到JFrame中,如下所示

findStudentFrame.add(panelWithLabelAndTextField)
findStudentFrame.add(paneLWithShcrollPane)

但这样做,似乎只添加了最后一个面板,而不是第一个

我最终也认为GridBagLayout可能不是这项任务的正确 Select ,我try 了GridBagLayoutFlowLayout的混合.它给出了更好的结果,但仍然不令人满意.但我认为最好是学会用GridBagLayout来解决这个问题,这样我才能学会正确地使用它.欢迎你提出建议,让我的结果/看起来更好.我已经在底部添加了我的整个代码,所以您可以运行和更改它.谢谢

enter image description here

I want something similaar to this enter image description here

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Toolkit;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class SwingPractice2 {
    
    private JFrame findStudentFrame;
    private JPanel panFindStudent, panTableResults;
    private JLabel labelAddStudEmail;
    private JTextField tFieldAddStudFirstName;
    
    private int textFieldWidth = 20,
            textFieldHeight = 10;
    
    private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    private int frameWidth = screenSize.width/4, 
            frameHeight = screenSize.height/3;
    
    public SwingPractice2() {
        findStudentFrame = new JFrame();
        //findStudentFrame.setLayout(new GridLayout(2, 1));
        //findStudentFrame.setSize(frameWidth, frameHeight);
        //addStudentFrame.setSize(frameWidth, frameHeight);
        panFindStudent = new JPanel(new GridBagLayout());
        panFindStudent.setPreferredSize(new Dimension(frameWidth, frameHeight));
        panFindStudent.setBorder(BorderFactory.createTitledBorder("Students"));
        
        labelAddStudEmail = new JLabel("Email");    
        tFieldAddStudFirstName = new JTextField();
        tFieldAddStudFirstName.setSize(textFieldWidth, textFieldHeight);
        
        panTableResults = new JPanel(new FlowLayout());
    }

    public void showStudentGUI() {
        GridBagConstraints gbcFindStud = new GridBagConstraints();
        gbcFindStud.anchor = GridBagConstraints.NORTHWEST;      
        gbcFindStud.gridx = 0;
        gbcFindStud.gridy = 0;
        gbcFindStud.weightx = 1.0;
        gbcFindStud.fill = GridBagConstraints.HORIZONTAL;
        gbcFindStud.insets = new Insets(5, 5, 5, 5);
        
        panFindStudent.add(labelAddStudEmail, gbcFindStud);
                
        gbcFindStud.gridx++;
        gbcFindStud.anchor = GridBagConstraints.NORTHEAST;
        panFindStudent.add(tFieldAddStudFirstName, gbcFindStud);
        
        String[] tableCols = new String[] {
            "ID", "First name", "Last name" 
        };
        
        String data[][] = {
                {"1", "Marcus", "Johnson" }, 
                {"2", "Miko", "Jameson"},
                {"2", "Kate", "Anderson"}
        };
        
        JTable table = new JTable(data, tableCols);     
        //table.setBounds(30, 40, 200, 300);
        
        JScrollPane jsp = new JScrollPane(table);   
        //jsp.setBounds(30, 40, 300, 300);
        
        gbcFindStud.gridx = 0;
        gbcFindStud.gridy = 1;
        gbcFindStud.fill = GridBagConstraints.HORIZONTAL;
        gbcFindStud.anchor = GridBagConstraints.CENTER;
                
        panFindStudent.add(jsp, gbcFindStud);
        
        findStudentFrame.add(panFindStudent);
        //findStudentFrame.add(jsp);
        findStudentFrame.pack();
        findStudentFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new SwingPractice2().showStudentGUI();
    }

}

推荐答案

首先,给你一些建议.

private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

不是获得显示器"可见"区域的最佳方式,它不会考虑大多数操作系统上可能会导致问题的停靠/菜单栏等东西的大小或位置.

就我个人而言,我会避免使用setPreferredSize,这可能会对您的布局产生future 的影响.

这个..

tFieldAddStudFirstName.setSize(textFieldWidth, textFieldHeight);

也无关紧要.

关于你的问题.

首先,gbcFindStud.weightx = 1.0;给我带来了问题.相反,对于Email标签,我只会使用...

gbcFindStud.anchor = GridBagConstraints.EAST;
gbcFindStud.gridx = 0;
gbcFindStud.gridy = 0;
gbcFindStud.insets = new Insets(5, 5, 5, 5);

这确保了标签只有它需要的那么大,为什么? 因为您希望文本字段与之对齐,以便两个元素之间存在视觉关联.

对于文本字段,我将使用...

gbcFindStud.gridx++;
gbcFindStud.fill = GridBagConstraints.HORIZONTAL;
gbcFindStud.weightx = 1.0;
panFindStudent.add(tFieldAddStudFirstName, gbcFindStud);

这确保了文本字段水平填充所有剩余的空间,不确定某些邮箱可能有多大的错误,但能够一目了然地阅读您键入的内容是很好的.

对于桌子,我会用...

gbcFindStud.gridx = 0;
gbcFindStud.gridy = 1;
gbcFindStud.gridwidth = GridBagConstraints.REMAINDER;
gbcFindStud.fill = GridBagConstraints.BOTH;
gbcFindStud.weighty = 1;

这里重要的部分是gbcFindStud.gridwidth = GridBagConstraints.REMAINDER.这确保了表将展开所有剩余的列.我还添加了gbcFindStud.weighty = 1以确保它将填充剩余的垂直空间(并将其他元素推到视图的顶部)

这现在产生了…

enter image description here

你仍然需要输入All Students标签,但根据我上面提供的信息,你应该能够弄清楚.别忘了引用How to Use GridBagLayout

别忘了,您可以使用多个容器,使用不同的布局管理器.

例如,邮箱标签和文本字段可以是单独的容器,然后可以使用BorderLayout将其添加到容器中,从而简化了逻辑.

Runnable example...

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SwingPractice2().showStudentGUI();
            }
        });
    }

    public class SwingPractice2 {

        private JFrame findStudentFrame;
        private JPanel panFindStudent, panTableResults;
        private JLabel labelAddStudEmail;
        private JTextField tFieldAddStudFirstName;

        public SwingPractice2() {
            findStudentFrame = new JFrame();
            panFindStudent = new JPanel(new GridBagLayout());
            panFindStudent.setBorder(BorderFactory.createTitledBorder("Students"));

            labelAddStudEmail = new JLabel("Email");
            tFieldAddStudFirstName = new JTextField();
        }

        public void showStudentGUI() {
            GridBagConstraints gbcFindStud = new GridBagConstraints();
            gbcFindStud.anchor = GridBagConstraints.EAST;
            gbcFindStud.gridx = 0;
            gbcFindStud.gridy = 0;
            gbcFindStud.insets = new Insets(5, 5, 5, 5);

            panFindStudent.add(labelAddStudEmail, gbcFindStud);

            gbcFindStud.gridx++;
            gbcFindStud.fill = GridBagConstraints.HORIZONTAL;
            gbcFindStud.weightx = 1.0;
            panFindStudent.add(tFieldAddStudFirstName, gbcFindStud);

            String[] tableCols = new String[]{
                "ID", "First name", "Last name"
            };

            String data[][] = {
                {"1", "Marcus", "Johnson"},
                {"2", "Miko", "Jameson"},
                {"2", "Kate", "Anderson"}
            };

            JTable table = new JTable(data, tableCols);

            JScrollPane jsp = new JScrollPane(table);

            gbcFindStud.gridx = 0;
            gbcFindStud.gridy = 1;
            gbcFindStud.gridwidth = GridBagConstraints.REMAINDER;
            gbcFindStud.fill = GridBagConstraints.BOTH;
            gbcFindStud.weighty = 1;

            panFindStudent.add(jsp, gbcFindStud);

            findStudentFrame.add(panFindStudent);
            findStudentFrame.pack();
            findStudentFrame.setVisible(true);
        }
    }
}

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

Cosmos Change Feed Process Lag远远超过收集中的记录数量

在AnyLogic中增加变量计数

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

从技术上讲,OPC UA客户端是否可以通过转发代理将请求通过 tunel 发送到OPC UA服务器?

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

Spring Boot 3.2.2中的@Inject和@Resource Remove

这是什么Java构造`(InputStream Is)->;()->;{}`

Jolt变换JSON数组问题

使用正则表达式从字符串中提取多个值

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

在缺少字段时使用Jackson With Options生成Optional.Empty()

在应用程序运行时更改LookAndFeel

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

控制器建议异常处理

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

为什么 log4j 过滤器在appender中不起作用

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml