netbeans 调整现有Java Swing应用程序的大小[已关闭]

3hvapo4f  于 2023-05-07  发布在  Java
关注(0)|答案(1)|浏览(172)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

14小时前关闭
Improve this question
我在netbeans中创建了一个GUI,其中大部分使用绝对布局。我想我的组件自动调整大小,我知道你必须使用gridbag布局这样做。我是否必须从头开始使用gridbag,或者是否可以更改现有代码并将所有组件保留在同一位置。
我试着把我的组件都改成gridbag布局,但它只打开了一个很小的窗口。当我把它展开时,它只是一个空白的灰色屏幕。

jfewjypa

jfewjypa1#

避免绝对定位

你说:
我在netbeans中创建了一个GUI,其中大部分使用绝对布局。
很少是一个好主意,因为你遇到的原因:这样的布局是不灵活的,迫使程序员进行像素数学运算,并剥夺了用户重新调整大小的能力。
Swing中的布局管理器是为了更容易地为用户给予调整大小的灵活性,并自动适应跨平台呈现大小的变化而发明的。

添加布局管理器时保留几乎所有代码

你说:
我必须重新开始…从一开始
不你不能从头开始您已经知道需要哪些小部件,以及它们的一般安排。您已经为这些小部件编写了行为。您已经在后台编写了业务逻辑来支持这些小部件的行为。你保存的所有代码。
你需要做的就是:

  • 决定一个合适的布局管理器,或者多个布局管理器相互嵌套.
  • 将已经定义的小部件添加到这些布局管理器中。

GridBagLayout只是几个布局管理器之一

你说:
我想我的组件自动调整大小,我知道你必须使用gridbag布局这样做。
不一定是GridBagLayout。Swing提供了各种捆绑的布局管理器。所有这些都提供了自动调整大小。
此外,您可以选择添加任何第三方布局管理器。
选择一个或多个,以满足您的需求。
Oracle免费提供范围广泛的tutorial on Swing。我建议你研究一下。注意visual example of several layout managers。这些措施包括:

  • BorderLayout
  • BoxLayout
  • CardLayout
  • 流程布局
  • 网格袋布局
  • GridLayout
  • 组布局
  • SpringLayout

最有用的是BorderLayout。这个布局管理器可以容纳普通业务应用程序中常见的元素。顶部的NORTH可以容纳菜单、字幕、帮助按钮等。左边的WEST可能包含导航栏。右侧的EAST可能有一个状态面板或描述性帮助内容。底部的SOUTH可以有breadcrumbs、* 接受 * 和 * 取消 * 按钮等。您的业务形式进入中心。任何未使用的空边折叠,不浪费任何空间。
你需要练习。每个布局管理器都有自己的逻辑和自己的怪癖。你需要了解和爱每一个人的优点。要有耐心;花在前期学习布局管理器上的时间,要比花在后期重新安排表单以适应变化上的时间多得多。
特别是,我建议您从FlowLayout开始。
请记住将一个布局管理器嵌套在另一个布局管理器中的概念。在熟悉了各种布局管理器之后,在纸上画出所需的表单。在该草图中,查找可以聚集到子布局中的小部件组。然后查看那些被安排在外部布局(如BorderLayout)中的子布局。

使用GridBagLayout指定约束来固定窗口大小

你说:
我的组件都是gridbag布局,但它只打开一个非常小的窗口。当我把它展开时,它只是一个空白的灰色屏幕。
关于窗口大小,对于GridBagLayout,您需要设置constraints。下面是一些示例代码,我的缩写example code provided by Oracle用于演示GridBagLayout

package work.basil.example.swing;

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

// An abbreviated version of example code provided by Oracle from:
// https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/layout/GridBagLayoutDemoProject/src/layout/GridBagLayoutDemo.java
public class HelloWorldSwing
{
    private static void createAndShowGUI ( )
    {
        JFrame.setDefaultLookAndFeelDecorated( true );

        // Establish the window, represented by a `JFrame` object.
        JFrame frame = new JFrame( "My First Hello World App" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        makeContent( frame.getContentPane() );

        // Show window.
        frame.pack();
        frame.setVisible( true );
    }

    private static void makeContent ( Container container )
    {
        container.setLayout( new GridBagLayout() );
        GridBagConstraints c = new GridBagConstraints();

        JButton button1 = new JButton( "Button 1" );
        c.weightx = 0.5;
        c.fill = GridBagConstraints.HORIZONTAL;  // Natural height. Maximum width.
        c.gridx = 0;
        c.gridy = 0;
        container.add( button1 , c );

        JButton button2 = new JButton( "Button 2" );
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 0;
        container.add( button2 , c );

        JButton buttonLongName = new JButton( "Long-Named Button 4" );
        c.fill = GridBagConstraints.HORIZONTAL;
        c.ipady = 40;      // Make this component tall.
        c.weightx = 0.0;
        c.gridwidth = 3;
        c.gridx = 0;
        c.gridy = 1;
        container.add( buttonLongName , c );
    }

    public static void main ( String[] args )
    {
        // Assign a task to event-dispatching thread: Create and show our GUI.
        javax.swing.SwingUtilities.invokeLater( HelloWorldSwing :: createAndShowGUI );
    }
}

运行时:

GridBagLayout是与Java捆绑在一起的最强大、最灵活的布局管理器。但是GridBagLayout也是最复杂的,也是最难学习的。如上所述,我强烈建议在第一次学习Swing时使用其他布局管理器。

JavaFX

顺便说一下,如果刚开始使用Swing,请注意Swing现在是在maintenance-mode中。Swing与每个版本的Java捆绑在一起,并将在未来许多年内得到完全支持。但是要知道,Oracle已经宣布JavaFX是Swing的官方继承者。
您可能希望将学习时间投入JavaFX而不是Swing。但是如果你急着使用一个相对简单的应用程序,那么只需要添加一个Swing布局管理器就可以了。
参见:

  • Oracle post:2020-05 -05
  • Oracle白色:2020-05 -05

相关问题