【问题标题】:Need "non-rectangular Card Layout Panel" or "Transparent component"需要“非矩形卡片布局面板”或“透明组件”
【发布时间】:2013-08-30 18:36:54
【问题描述】:

我有一个新的要求来改变我的显示器。

目前,我在具有卡片布局的面板上方有一排 3 个单选按钮。按钮控制显示卡布局面板的哪张卡。但这似乎浪费了宝贵的屏幕空间。

使用拥有按钮的面板上的 GridLayout(4,1) 及其标题标签,可以轻松地将按钮行转换为按钮列。这个面板理论上可以放置在卡片布局面板中显示的每张卡片的左上角,并且每张卡片的顶行可以向上移动到按钮面板的右侧,从而为已有的内容留出更多空间来到下面。

但是对此的收容模型应该是什么?在此变体中,按钮面板必须出现在每张卡片上。谁拥有它?从逻辑上讲,它需要由所有这些所在的父面板拥有,但它不会显示在卡片上,这将覆盖它 - 除非我可以

  1. 在显示时将按钮面板添加到每张卡片,这可能会很乱并且可能会导致闪烁。
  2. 使每张卡片的左上角透明,使其显示其父级拥有的左上角按钮面板。但是我该怎么做呢?

其他解决方案?

也许

  1. 有两个由单选按钮控制的卡片布局面板。右上角包含除按钮面板和位于两者下方的下部组件之外的所有组件。

【问题讨论】:

    标签: java swing jpanel transparent cardlayout


    【解决方案1】:

    听起来您可以使用 JLayeredPane 作为两者的父组件,即包含单选按钮的面板和卡片面板。

    JLayeredPane 允许其子组件重叠,每个子组件都属于一个层。

    要指定层,您可以将一个整数常量作为约束参数传递给 JLayeredPane 的 add(Component, Object) 方法。整数常量在 JLayeredPane 类本身中定义。您可以将 JLayeredPane.DEFAULT_LAYER 用于卡片面板,将 JLayeredPane.PALETTE_LAYER 用于单选按钮面板。

    设置图层后,您仍然需要在 x,y 空间中正确定位两个面板。我建议只用类似这样的东西覆盖 JLayeredPane 的 doLayout() 方法(尚未测试):

    public void doLayout()
    {
        cardPanel.setBounds( new Rectangle( getSize() ));
        radioButtonPanel.setBounds( new Rectangle( radtioButtonPanel.getPreferredSize() ));
    }
    

    【讨论】:

    • 我喜欢这个,它设置简单,看起来可以工作。
    • +1 不错的选择;另请参阅相关的example
    【解决方案2】:

    您可以使用OverlayLayout 在卡片面板的左上角显示控制面板。

    【讨论】:

      【解决方案3】:

      我会忘记透明度的想法。只需将选项作为列表放在卡片面板的左侧(或右侧,或上方/下方)。我绝对不会将控件面板放在 CardPanel 本身上。它应该在外面。

      选择列表可以是单选按钮、按钮,或者在本例中,可以增长而不会弄乱布局的项目的 JList。例如:

      /*
       * CardLayoutDemo.java
       */
      import java.awt.*;
      
      import javax.swing.*;
      import javax.swing.event.*;
      
      @SuppressWarnings("unchecked")
      public class CardLayoutDemo implements Runnable
      {
        final static String CARD1 = "Gray Panel";
        final static String CARD2 = "Blue Panel";
        final static String CARD3 = "Green Panel";
      
        JPanel cards;
        CardLayout cl;
      
        public static void main(String[] args)
        {
          SwingUtilities.invokeLater(new CardLayoutDemo());
        }
      
        public void run()
        {
          final JList jList = new JList(new String[]{CARD1, CARD2, CARD3});
          jList.setPrototypeCellValue("XXXXXXXXXXXX");
          jList.setVisibleRowCount(5);
          jList.setSelectedIndex(0);
          jList.addListSelectionListener(new ListSelectionListener()
          {
            @Override
            public void valueChanged(ListSelectionEvent e)
            {
              String name = jList.getSelectedValue().toString();
              cl.show(cards, name);
            }
          });
      
          JScrollPane scroll = new JScrollPane(jList);
          scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
      
          Dimension dim = new Dimension(300, 300);
      
          JPanel card1 = new JPanel();
          card1.setBackground(Color.GRAY);
          card1.setPreferredSize(dim);
      
          JPanel card2 = new JPanel();
          card2.setBackground(Color.BLUE);
          card2.setPreferredSize(dim);
      
          JPanel card3 = new JPanel();
          card3.setBackground(Color.GREEN);
          card3.setPreferredSize(dim);
      
          cl = new CardLayout();
          cards = new JPanel(cl);
          cards.add(card1, CARD1);
          cards.add(card2, CARD2);
          cards.add(card3, CARD3);
      
          JFrame f = new JFrame("CardLayout Demo");
          f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          f.add(scroll, BorderLayout.WEST);
          f.add(cards, BorderLayout.CENTER);
          f.pack();
          f.setLocationRelativeTo(null);
          f.setVisible(true);
        }
      }
      

      如果您想要选择的标签,只需制作一个包含 JLabel 和 JScrollPane 的“选择面板”(或使用您的按钮面板网格),并将其放入 Borderlayout.WEST(而不是添加 JScrollPane直接)。

      另外,请查看JTabbedPane 作为替代方案。

      【讨论】:

      • 透明度是一罐蠕虫,是的。我同意按钮不属于卡片。但是上面 user2734169 的解决方案更简单。不过还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多