【问题标题】:Layout Problem in Java - set a 20%opaque Panel on Bottom of JFrameJava 中的布局问题 - 在 JFrame 底部设置一个 20% 不透明的面板
【发布时间】:2020-04-09 22:53:53
【问题描述】:

好吧,实际上我在 java Swing 中有一个布局问题。我只是想在 Frame 的底部添加一个 JPanel - 一个可以在大约 5 分钟内使用每种基于 Web 的语言完成的编码片段。在 Java 中并非如此。我尝试将 jPanel 添加到包含 jContentPane 的 jFrame,将 jPanel 的大小设置为我需要的大小,并重新绘制和重新验证 jFrame,并将 LayOutManager 设置为 null。

在这种情况下,Java 向我展示了一个全角的 jPanel,它填满了我的整个 jFrame。

因此我尝试了另一种方法:我将我的 jPanel 分为顶部完全透明的 jPanel 和底部 20% 不透明的 jPanel。还是没有达到预期的效果。

从那时起,我尝试调整新面板和面板的子 jPanel 的大小,并尝试重新绘制和重新验证 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();
}

我的预期:

它实际上做了什么:

【问题讨论】:

  • 您需要为该工作申请适当的layout managers。如需更多帮助,请发帖minimal reproducible example。旁注:见java naming conventions
  • 看看你的期望和你得到的,明确地开始使用LayoutManagers。同样在这种情况下,您只需要添加ContentPanelundoPanel = ContentPanel; myJFrame.add(undoPanel);
  • 谢谢大家的快速回复。如果我使用 LayoutManager BoxLayout 我会收到一个 jFrame 除以 2 个高度为 50% 的 jPanel - 我如何更改它以获得一个具有 80% 高度的面板和另一个具有 20% 高度的分隔的 JFrame? :)
  • 啊,谢谢。我通过使用 BoxLayout 和 RigidArea 解决了它 :) 我将在评论中提供该解决方案,以防其他人再次遇到相同的问题:D

标签: java swing


【解决方案1】:

好吧,我通过使用 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();
}

现在它的行为符合预期:

【讨论】:

    【解决方案2】:

    BorderLyout 会更容易实现。
    注意以下mre中的cmets:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 2017-01-25
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多