繁体   English   中英

设置GridBagLayout网格的大小

[英]Setting GridBagLayout grid's size

我正在尝试使用Java Swing(GridBagLayout)创建一个控制台。

我不知道为什么,但是如您所见,在左边距处,网格的尺寸不正确。

代码输出

应该以这种方式显示: 在此处输入图片说明

浅蓝色是列表,图像为绿色,文本面板为橙色,文本字段为黄色。

我不知道如何使列表变大和图像变小。 文本字段的网格也绑定到列表1,即使列表位于y 1且文本字段位于y 2也是如此。

这是一些代码。

// Command List
DefaultListModel<String> listInput = new DefaultListModel<String>();
JList<String> list = new JList<String>(listInput);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = new JScrollPane(list);
list.setBackground(new Color(160, 160, 160));
list.setSelectionBackground(new Color(150, 150, 150));
scrollPane.setPreferredSize(new Dimension(20, 20));
manager.setCommandList(listInput);

    c.insets = new Insets(2, 2, 2, 2);
    c.ipady = 0;
    c.ipadx = 100;
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    c.gridheight = 2;
    c.weightx = 0.1;
    c.weighty = 0.6;
    c.fill = GridBagConstraints.BOTH;
console.add(scrollPane, c);

// Image Displayer
JLabel image = new JLabel(new ImageIcon());
manager.setImageField(image);

    c.insets = new Insets(0, 0, 0, 0);
    c.ipady = 0;
    c.ipadx = 0;
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.weightx = 0.1;
    c.weighty = 0.3;
    c.fill = GridBagConstraints.BOTH;
console.add(image, c);

其中“ c”是一个网格袋约束,用于管理主JPanel。 如您所见,列表的网格高度为2,权重为0.6,图像的网格高度为1,权重为0.9,所以不确定为什么列表比图像小4倍。

另一个问题是,我向JLabel添加了一个侦听器,用于保存图像(调整大小),无论如何,它没有被调用。 我应该将侦听器添加到主面板吗? 因为图像只能由布局管理器调整大小。

谢谢^^

编辑:SSCCE:

package co.relieved.jelly.application.display.swing;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.ListSelectionModel;

@SuppressWarnings("serial")
public class Test extends JPanel {

    static JLabel image;

    public static void main(String[] args) {
        display();
        try {
            BufferedImage buffer = ImageIO
                .read(new File("/home/juanco/Pictures/Screenshot from 2016-02-08 22-43-22.png"));
            image.setIcon(new ImageIcon(
                buffer.getScaledInstance(image.getWidth(), image.getHeight(), BufferedImage.SCALE_SMOOTH)));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public Test() {
        super(new GridLayout(1, 1));
        JTabbedPane tabs = new JTabbedPane();

        /*** >>> Console Pane <<< ***/
        JPanel console = new JPanel();
        console.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        c.ipadx = 0;
        c.ipady = 0;
        c.gridwidth = 1;
        c.anchor = GridBagConstraints.CENTER;
        c.fill = GridBagConstraints.BOTH;

        // Console Screen
        JTextPane screen = new JTextPane();
        screen.setEditable(false);

        c.gridx = 1;
        c.gridy = 0;
        c.gridheight = 2;
        c.weightx = 0.8;
        c.weighty = 1;
        console.add(screen, c);

        // Console Input
        JTextField input = new JTextField();

        c.insets = new Insets(2, 0, 2, 0);
        c.ipady = 3;
        c.gridy = 2;
        c.gridheight = 1;
        c.weighty = 0;
        c.fill = GridBagConstraints.HORIZONTAL;
        console.add(input, c);

        // Command List
        DefaultListModel<String> listInput = new DefaultListModel<String>();
        listInput.setSize(1);
        JList<String> list = new JList<String>(listInput);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        JScrollPane scrollPane = new JScrollPane(list);

        c.insets = new Insets(2, 2, 2, 2);
        c.ipady = 0;
        c.ipadx = 100;
        c.gridx = 0;
        c.gridy = 1;
        c.gridheight = 2;
        c.weightx = 0.1;
        c.weighty = 0.6;
        c.fill = GridBagConstraints.BOTH;
        console.add(scrollPane, c);

        // Image Displayer
        image = new JLabel(new ImageIcon());

        c.insets = new Insets(0, 0, 0, 0);
        c.ipadx = 0;
        c.gridy = 0;
        c.gridheight = 1;
        c.weighty = 0.3;
        console.add(image, c);

        // General
        tabs.addTab("Console", console);

        /*** >>> Logs Pane <<< ***/
        JPanel logs = new JPanel();

        tabs.addTab("Logs", logs);

        // Setup
        tabs.setSelectedIndex(0);
        add(tabs);
    }

    static void display() {
        JFrame frame = new JFrame("Relieved Console");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setPreferredSize(new Dimension(800, 500));
        frame.add(new Test(), BorderLayout.CENTER);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

这是一些代码。

这没有帮助。 网格只能使用完整的代码来完成。 也就是说,我们需要知道所有组件的网格宽度和网格高度,以便确定网格中每个组件的空间分配。

文本字段的网格已绑定到列表1,即使列表位于y 1而文本字段位于y 2也是如此。

您不能只是将组件随机分配给网格。 仅当组件上方的组件的网格高度为2时,该组件才会进入网格2。因此,基本上每个列都需要具有总网格高度为3的组件。

我不知道如何扩大名单

将首选大小设置为(20,20)并没有帮助。 无论如何,您不应该使用setPreferredSize()方法。

相反,您应该使用:

list.setVisibleRowCount(...);

指定可见的行。 然后,JList可以确定其自己的首选大小。

另一个布局选项是使用嵌套面板,可以简化布局。

因此,您可以从使用BorderLayout的“西”面板开始。 然后,将标签添加到“ PAGE_START”,将列表添加到“ CENTER”。

然后,您创建一个“中心”面板。 将主要组件添加到“ CENTER”,并将文本字段添加到“ PAGE_START”。

然后将两个面板添加到框架:

frame.add(westPanel, BorderLayout.LINE_START);
frame.add(centerPanel, BorderLayout.CENTER);

编辑:

抱歉,我回想一下有关使每列的网格高度为3的评论。您不能仅将总网格高度指定为3,因为每列中只有2个组件,所以每个组件的高度只能为1 。

在这篇文章中查看我的答案: 为什么此GridBagLayout不能按计划显示? 允许您通过在行/列中使用不可见组件来操纵gridHeight / Weight的hack。

但是,我不推荐这种方法。 使用BorderLayout(或嵌套面板上的其他布局管理器)使用嵌套面板的建议将容易得多。

在我看来,您还需要为文本字段指定gridwidth和/或gridheight

GridBagLayout就像荣耀的GridLayout。 它将尝试将所有组件与周围最近的网格空间对齐。 Oracle的教程也描述了这种行为。

很多时候,使用GridBagLayout布局组件的问题来自其他组件,而不是明显的问题子组件。

我修复了将“控制台” JPanel分为两个的问题,一个是左侧的边框布局面板,一个是右侧的网格包布局面板。 正如@camickr建议的

暂无
暂无

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

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