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

Java中的布局问题-在JFrame底部设置一个20%不透明的面板

戚云
2023-03-14

实际上,我在JavaSwing中遇到了一个布局问题。我只想在一个框架的底部添加一个JPanel——一个可以在大约5分钟内用每种基于web的语言完成的编码snipplet。在Java中并非如此。我尝试将jPanel添加到包含jContentPane的jFrame中,将jPanel的大小设置为所需大小,重新绘制并重新验证jFrame,并将LayOutManager设置为null。

在本例中,Java向我展示了一个全宽度的jPanel,它填充了我的整个jFrame。

因此,我尝试了另一种方法:我在顶部的一个完全透明的jPanel和底部的一个20%不透明的jPanel中划分我的jPanel。然而,它并没有像预期的那样成功。

从那以后,我试图调整我的新面板和面板的子jPanels的大小,并试图重新绘制和重新验证jFrame。没有任何效果。

尽管我付出了努力,java仍然在整个jFrame上向我展示了一个全尺寸的20%不透明jPanel,现在它在顶部包含了另一个20%不透明jPanel。

我知道整个问题都是由LayoutManager造成的,默认情况下Java无用。然而,将LayoutManager设置为null甚至更改jFrame的LayoutManager都不是一个选项,因为这将导致我们重构我们已经开发了几个星期的微型应用程序的整个功能。

    public void showUndoPanel() {

    System .out.println("Show Undo Panel");

    JPanel myPanel = new JPanel(null);
    JPanel glassPanel = new JPanel();
    JPanel ContentPanel = new JPanel();
    JLabel myJLabel = new JLabel("Great Job!");

    myPanel.setBackground(new Color(255,122,122,100));

    glassPanel.setSize(650, 550);
    glassPanel.setBackground(new Color(255,122,122,100));
    myPanel.add(glassPanel);

    ContentPanel.setSize(650, 30);
    ContentPanel.setBackground(new Color(255,122,122,20));
    ContentPanel.add(myJLabel);


    myPanel.revalidate();
    myPanel.repaint();

    undoPanel = myPanel;
    myJFrame.add(undoPanel);
    myJFrame.revalidate();
}

我所期望的是:

它实际的作用:

共有2个答案

长孙阳焱
2023-03-14

BorderLyout将使其更易于实施
注意以下mre中的注释:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

    private static JFrame myJFrame;

    public static void main(String[] args)  {

        myJFrame = new JFrame();
        myJFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        myJFrame.setLocationRelativeTo(null);
        showUndoPanel();
        myJFrame.pack();
        myJFrame.setVisible(true);
    }

    public static void showUndoPanel() {

        JPanel myPanel = new JPanel();
        myPanel.setBackground(new Color(255,255,255,0));
        myPanel.setLayout(new BorderLayout());

        JPanel glassPanel = new JPanel(); //uses FlowLayout by default
        //glassPanel.setSize(650, 650); //use preferred size
        glassPanel.setPreferredSize(new Dimension(650, 650));
        //glassPanel.setBounds(0,0,650,550);   //no need to set bounds. bounds are set by the layout manager

        glassPanel.setBackground(new Color(255,122,122,0));
        myPanel.add(glassPanel, BorderLayout.CENTER);

        JPanel contentPanel = new JPanel(); //uses FlowLayout by default
        //contentPanel.setSize(650, 30);//use preferred size
        contentPanel.setPreferredSize(new Dimension(650, 30));
        //contentPanel.setBounds(0,750,650,30);   //no need to set bounds. bounds are set by the layout manager
        contentPanel.setBackground(new Color(255,122,122,20));
        JLabel myJLabel = new JLabel("Great Job!");
        contentPanel.add(myJLabel);

        myPanel.add(contentPanel, BorderLayout.SOUTH);
        myJFrame.add(myPanel);
    }
}
柏高洁
2023-03-14

我用BoxLayoutManager和RigidArea解决了这个问题。如果将来有人可能再次遇到这个问题,我决定为这个简单的解决方案提供代码。

    public void showUndoPanel() {

    System .out.println("Show Undo Panel");

    JPanel myPanel = new JPanel(null);
    JPanel glassPanel = new JPanel();
    JPanel ContentPanel = new JPanel();
    JLabel myJLabel = new JLabel("Great Job!");

    myPanel.setBackground(new Color(255,255,255,0));
    myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.PAGE_AXIS));

    glassPanel.setSize(650, 650);
    glassPanel.setBounds(0,0,650,550);
    glassPanel.setBackground(new Color(255,122,122,0));
    myPanel.add(glassPanel);
    myPanel.add(Box.createRigidArea(new Dimension(0,450)));


    ContentPanel.setSize(650, 30);
    ContentPanel.setBounds(0,750,650,30);
    ContentPanel.setBackground(new Color(255,122,122,20));
    ContentPanel.add(myJLabel);

    myPanel.add(ContentPanel);
    myPanel.revalidate();
    myPanel.repaint();

    undoPanel = myPanel;
    myJFrame.add(undoPanel);
    myJFrame.revalidate();
}

现在它的行为如预期:

 类似资料:
  • 问题内容: 是否可以设置和获取布局的Alpha /不透明度及其所有子视图?我不是在说背景。在相对布局中说出视频控件的集合,例如播放,暂停和进度条。 我可以使用动画淡入淡出,但想知道是否可以使用直接方法。 问题答案: 您可以使用持续时间为0的AlphaAnimation和setFillAfter选项在布局及其子级(或其他任何视图)上设置Alpha。 例: 您可以将一个动画用于多个组件以节​​省内存。

  • 这可能是一个非常基本的问题,但我在网上找不到任何关于它的东西。 有办法做这样的事吗?我是不是漏掉了一些明显的东西?如果没有,是否有方法侦听容器高度的变化并重新调用?

  • 问题内容: 假设我要使JPanel%20的不透明度可见。我的意思不是setOpaque(绘制或不绘制)或setVisible(显示或隐藏)…我的意思是使其透明JPanel ..您知道吗? 这可能吗? 问题答案: 您还应该查看具有透明度的背景,以了解使用此功能时可能遇到的任何绘画问题。

  • 我在滚动窗格中有一个带有按钮的网格窗格。当所需的按钮数量不足以填充ScrollPane的最大大小时,它看起来像下面的图像。我需要将这个空白点设置为包含它的窗格的背景色。 我尝试将网格的背景颜色设置为包含它的背景窗格的相同颜色,但它只是用按钮为线条着色。如果我尝试将ScrollPane的不透明度设置为0,它也设置了按钮的不透明度,所以我看不到任何东西,即使我设置了按钮的不透明度之后。 我怎么能这么做

  • 我试图创建一个假想的车辆,有自动和手动模式的用户界面。当用户将车辆设置为其中一种模式时,它应该只显示与该模式相关的控件,我已经使用CardLayout完成了这一点。 然而,我也希望能够为每张卡片手动指定布局中各种元素的位置——对于静态布局,我会按照,但在CardLayout上使用时,这只会给出一个空白窗口(因此下面代码中有两行注释掉)。 我如何实现这两个目标?我目前的代码如下: