当前位置: 首页 > 知识库问答 >
问题:

调整大小会出错

齐俊达
2023-03-14

我想创建一个包含一些组件的JInternalFrame。

我的目标是用Java设计一个bash控制台。

我的框架由4个组件组成:

  • 包含在JScrollPane中的JTextArea
  • 带有文本“Cmd:”的JLabel
  • JTextField
  • 带有文本“发送”的JButton

我有以下代码:

Box box = Box.createHorizontalBox();
box.add(Box.createVerticalStrut(5));
box.add(this.cmd_label);
box.add(Box.createVerticalStrut(5));
box.add(this.cmd_input);
box.add(Box.createVerticalStrut(5));
box.add(this.submit);
box.add(Box.createVerticalStrut(5));

Box mainBox = Box.createVerticalBox();
mainBox.add(Box.createHorizontalStrut(5));
mainBox.add(this.result_scroll);
mainBox.add(Box.createHorizontalStrut(5));
mainBox.add(box);
mainBox.add(Box.createHorizontalStrut(5));
add(mainBox);

因此,当帧未最大化时,我有一个正确的外观:

但当我将其最大化时,所有组件的位置都不正确:

因此,我的问题是:如何为组件设置权重以每次固定其位置,或者如何固定它?

谢谢。

共有3个答案

祝花蜂
2023-03-14

这里的基本问题是我认为JTextField最大布局提示中的一个错误:它在水平和垂直维度上都没有界限。对于设计用于显示单行文本的组件来说,后者纯粹是无稽之谈。要修复,子类并让它返回其高度的首选项,例如:

JTextField cmdInput = new JTextField() {

    @Override
    public Dimension getMaximumSize() {
        Dimension max = super.getMaximumSize();
        max.height = getPreferredSize().height;
        return max;
    }

};

由于BoxLayout尊重maxSize,因此现在将仅为机顶盒提供额外高度。

从长远来看,考虑切换到第三方管理器,它允许在一个面板中进行微调。是的,我现在最喜欢的是MigLayout。将以下几行代码与上面的所有嵌套和边界技巧进行比较,并从中获得乐趣:-)

MigLayout layout = new MigLayout("wrap 3, debug", 
        "[][grow, fill][]", // 3 columns, middle column filled and allows growing
        "[grow, fill][]"); // two rows, first filled and allows growing

JComponent content = new JPanel(layout);
// the scrollPane in the first row spanning all columns
// and growing in both directions 
content.add(new JScrollPane(new JTextArea(20, 20)), "span, grow");
// auto-wrapped to first column in second row
content.add(new JLabel("Cmd:"));
content.add(new JTextField());
content.add(new JButton("Submit"));
秦经义
2023-03-14

请尝试以下代码,这种行为是否例外:

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

public class LayoutExample
{
    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("LAYOUT EXAMPLE");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new BorderLayout(5, 5));
        centerPanel.setBorder(
                    BorderFactory.createEmptyBorder(2, 2, 2, 2));
        JTextArea tarea = new JTextArea(10, 10);
        tarea.setBackground(Color.DARK_GRAY.darker());  
        tarea.setForeground(Color.WHITE);
        tarea.setCaretColor(Color.WHITE);
        tarea.setLineWrap(true);

        JScrollPane scrollPane = new JScrollPane(tarea);
        centerPanel.add(scrollPane, BorderLayout.CENTER);

        JPanel footerPanel = new JPanel();
        footerPanel.setLayout(new BorderLayout(5, 5));
        footerPanel.setBorder(
                    BorderFactory.createEmptyBorder(2, 2, 2, 2));       
        JLabel cmdLabel = new JLabel("Cmd : ");         
        JTextField tfield = new JTextField(10);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setBorder(
                    BorderFactory.createEmptyBorder(2, 2, 2, 2));
        JButton sendButton = new JButton("SEND");

        footerPanel.add(cmdLabel, BorderLayout.LINE_START);
        footerPanel.add(tfield, BorderLayout.CENTER);
        buttonPanel.add(sendButton);
        footerPanel.add(buttonPanel, BorderLayout.LINE_END);

        frame.getContentPane().add(centerPanel, BorderLayout.CENTER);
        frame.getContentPane().add(footerPanel, BorderLayout.PAGE_END);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {   
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new LayoutExample().createAndDisplayGUI();
            }
        });
    }
}

输出:

漆雕成弘
2023-03-14

我认为这最好使用BorderLayout来完成。在BorderLayout中,指定为中心组件的组件将展开以填充尽可能多的空间,而其他组件将保持其首选大小。

int hgap = 5;
int vgap = 5;
internalFrame.getContentPane().setLayout(new BorderLayout(hgap, vgap));
internalFrame.getContentPane().add(this.result_scroll, BorderLayout.CENTER);
JPanel bottomPanel = new JPanel();
bottomPanel.add(this.cmd_label);
bottomPanel.add(this.cmd_input);
bottomPanel.add(this.submit);
internalFrame.getContentPane().add(bottomPanel, BorderLayout.SOUTH);
 类似资料:
  • 已经建立了一个小的测试SWING应用程序,有三个面板。一个主JPanel,包含两个较小的JPanel。一个在左边(板面板),另一个在右边(侧板)。通过调用min、preferred和max size方法,两个内部面板都被设置为请求的特定大小。右面板中的一个按钮将父JFrame设置为not re-sizable。在父帧设置为不可调整大小之前,一切看起来都很好,这会导致(?!)调整框架和主面板的大小,

  • 我正在尝试构建一个包含6个窗格(作为父级添加到GridPane布局中)的简单Java项目。我必须在开始时设置窗口大小,并通过参考根布局的宽度和高度,设法将它们均匀地拆分。 但我想要他们调整大小,因为我改变了窗口的大小(使用鼠标,现在他们得到固定的大小)。 下面是我的代码:

  • 问题内容: 我一直试图(徒劳地)建立一个页面,当我更改窗口大小时,其元素将重新调整大小。我可以在CSS中使用它来处理图像,但是没有问题,但是我似乎无法在文本上完成相同的操作,而且我不确定在CSS中是否有可能。而且我似乎找不到能完成此任务的jQuery脚本。 当用户调整窗口大小时,我实质上希望页面能够动态流畅地缩放,而无需用户调用页面缩放。通过css在我的img div上这可以正常工作,但对于文本则

  • 问题内容: 下面的代码调整位图的大小并保持宽高比。我想知道是否有一种更有效的大小调整方法,因为我想到了我正在编写android API中已经可用的代码。 问题答案: 使用方法:)

  • 问题内容: 当前版本的Firefox和Chrome包含一个拖动处理程序以调整框的大小。我需要捕获调整大小的事件,我认为使用jQuery的事件会很容易,但是它不起作用! 有没有办法捕获它? 问题答案: Chrome不会捕获resize事件,Chrome不会捕获mousedown,因此您需要设置init状态,然后通过mouseup处理更改: HTML 注意: 您可以像侯赛因所做的那样附加自己可调整大小

  • 问题内容: 我在这里使用Go调整大小包:https://github.com/nfnt/resize 我正在从S3中提取图像,如下所示: // this gives me data []byte 之后,我需要调整图像大小: // problem is that the original_image has to be of type image.Image 将图像上传到我的S3存储桶 // pro