Java AWT setLayout(null)似乎不起作用

时间:2018-04-04 22:30:26

标签: java awt layout-manager null-layout-manager

我试图重新利用现有的Java AWT(独立)应用程序在专用的单一用途硬件上运行(想想博物馆里的一个自助服务终端,它也控制着幕后的硬件)以及我的推测如果我只是将主面板上的布局管理器设置为null,我可以使用类似Rectangle(starting x, starting y, x-width, y-height)或其他类似方法来布置项目来定位事物,这已被证明是错误的!所以,我比我想象的还要多!

以下是一些摘录:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
[...]
public class myGUI extends JFrame
{
  JPanel MainPanel = new JPanel();
  JMenuBar Menu = new JMenuBar();
  int MaxWidth = 1920;
  int MaxHeight = 1080;
  Dimension FullScreen = new Dimension(MaxHeight, MaxWidth);
  Rectangle recHZbar = new Rectangle(0, 32, MaxWidth, 4);
[...]
    MainPanel.setLayout(null);
    MainPanel.setPreferredSize(FullScreen);
    MainPanel.setEnabled(true);
    MainPanel.setBackground(LightBlue);

各种各样的组件总共大约有一百个左右,在这里展示它们是没有意义的。我只想说我试图消除独立的帧,而是在非常大的屏幕边缘显示所有数据,然后用关键数据分别管理屏幕的中心空间,希望能够使用切换用户看到的内容(而不是窗格/面板)的可见性,因为在许多情况下存在很多共性。

我认为通过将布局管理器设置为null,我可以使用像这个水平条一样的东西在MainPanel上定位组件,并在其中嵌入一条消息:

JLabel HorizontalBar = new JLabel();
HorizontalBar.setBackground(DarkBlue);
HorizontalBar.setFont(new java.awt.Font("Dialog", 0, 10));
HorizontalBar.setForeground(LightBlue);
HorizontalBar.setPreferredSize(dimMxW10pt);
HorizontalBar.setOpaque(true);
HorizontalBar.setHorizontalTextPosition(SwingConstants.CENTER);
HorizontalBar.setText(HZBarTxt);
HorizontalBar.setBounds(recHZbar);
MainPanel.add(HorizontalBar, null);

......当然,这是有效的,但是,当我尝试定位这个水平条(通过setBounds(rectangle))时,很明显坐标是基于底部的JMenuBar我之前添加了,而不是从屏幕的左上角!这让我很担心! (我认为下一个栏会基于第一个栏下面的空间等等?!)我是否正确地认为我有一个布局管理员我没有(明确地)要求? (如果是这样,我该如何避免它?)

我希望我能够忽视一些简单的事情,无需经过太多的工作就可以自己定位。如果我不能选择我想要在屏幕上显示的内容,我将在这个项目上遇到麻烦!我希望避免使用很多小面板等。我需要创建不规则的列等等。我知道我可以用数学来解释我想要的东西,而且我不愿意相信布局管理器能够做到正确,特别是因为对实际生产硬件的测试非常困难,并且如果布局管理器不同的是,它意味着麻烦。我很可能会忽略正确的布局经理 - 也许是自己做布局经理"或许? - 但我不知道" GridLayout"至少,不容易,对我有用。所以我希望尽可能简单直接地学习如何做我自己的布局(这就是我认为我已经在做的事情)。

TIA。

1 个答案:

答案 0 :(得分:0)

事实证明,我对setLayout(null)的调用无效的原始假设本身就是错误的,这是件好事!

根据我的要求,我完全正确地选择了NOT使用窗口管理器。是的,从很多人认为的问题的评论中可以很容易地看到它。愚蠢甚至愚蠢到不使用窗口管理器,但在我的情况下,我做出了正确的选择,这就是原因:

这个项目的情况是"自己动手做的极少数情况之一",实际上,如果我使用窗口管理器它就不会工作out _AT_ALL!_ ......至少在我没有的时候。

简要回顾此项目的用例

这是专用的硬件控制,实际上,它无法在任何地方生产,而是Java代码为其提供用户界面的专用硬件的非常单一的安装。此外,它永远不会有任何互联网连接,永远不会升级。无论是操作系统还是其他软件升级都存在零关注 - 这是不可能发生的。由于它具有单一的固定运行环境,因此无需担心字体更改处理或类似情况。

应用程序设计;为什么布局管理器会搞砸

我选择使用一个框架,"未修饰的"所以如果填满整个显示器,就像这样:

An example where a layout manager can't do the job.

这完全填满了1090 X 1920显示器,所以IDK将会如何进入这里。

我创建了一个JFrame作为整个事物的背景。在其中,我首先创建了一个菜单栏,然后​​是一个标题/标题栏,对于这些东西,布局管理员当然可以做得很好,但这就是简单部分的结束。 / p>

我创建了一个左右不同宽度的列,然后在底部创建一个部分,只需使用item.setBounds(X, Y, W, H)放置项目即可。我使用变量作为值,并使用它们来创建标准行和列位置,宽度和高度。这样可以在需要的地方轻松转换标准;我只是使用一组不同的变量(使用我发明的命名约定来保持简单)。我想象你可能已经使用了这个部分的布局管理器,但它本来很乏味,而且根本不清楚它本来就不会那么简单。特别是,如何将两个垂直列放在您想要的位置?您必须为每列中的每个不同格式的区域创建单独的嵌入窗格/面板 - 甚至是底行!你也必须让它们堆叠或空间恰到好处。然后有那些垂直和水平的条 - 你怎么做?

从本质上讲,我在中心留下了一个嵌入式面板的空间,其中有一个非常大的(!!)方式,比你在样本图像中看到的更明显。当然,他们只是JPanels,其中只有一个在这里可见。 这就是布局管理器完全落伍的地方。 良好的用户界面设计可以保持一致性,因此用户可以知道在哪里可以找到各种各样的东西。并且各种面板,有些东西在一些面板中很常见,而在另一些面板上则有所不同,具有不同的通用性,并且还有更多的面板在不同的窗格之间交叉通用,但很少有面板真的足够普通的布局管理器打包算法可以处理;由于各种原因,各种项目 - 并且需要 - 可能看起来是非标准位置,因此使用布局管理器将需要填充具有许多子面板的窗格等,以便各种布局中的每一个经理们可以正常地完成工作。 通过不使用布局管理器,从而可以自由地在查看不同的嵌入窗格时准确指定组件的不同位置,我能够非常简单地使用{{1}用于在窗格之间移动项目并保持位置的语法。此外,由于外部面板和内部面板的顶部位置相同,因此获得完全正确的行很简单!

这是最简单的方法。我一直在和那个该死的布局经理打架。 ......不要害怕跳过一个布局经理并做好自己的准备,只要准备好自己完成整个工作。如果您完成了这项任务,并且如果您有像我一样的固定用例情况,那就不是那么糟糕了,它甚至可能是唯一的实用某些任务的方式。