Java “需要”;“非矩形卡片布局面板”;或;“透明组件”;

Java “需要”;“非矩形卡片布局面板”;或;“透明组件”;,java,swing,jpanel,transparent,cardlayout,Java,Swing,Jpanel,Transparent,Cardlayout,我有一个新的要求改变我的显示器 目前,我有一排3个单选按钮,它们位于具有卡片布局的面板上方。这些按钮控制显示卡片布局面板中的哪个卡片。但这似乎浪费了宝贵的屏幕空间 使用拥有按钮的面板上的GridLayout(4,1)及其标题标签,可以轻松地将按钮行转换为按钮列。理论上,该面板可以放置在卡片布局面板中显示的每张卡片的左上角,并且每张卡片的顶行可以向上移动到按钮面板的右侧,为下面的内容留出更多空间 但是,这方面的遏制模式应该是什么?在此变体中,每个卡上都必须显示按钮面板。谁拥有它?从逻辑上讲,它需要

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

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

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

但是,这方面的遏制模式应该是什么?在此变体中,每个卡上都必须显示按钮面板。谁拥有它?从逻辑上讲,它需要归所有这些东西所在的父面板所有,但它不会显示在卡片上,这会覆盖它-除非我可以

  • 在显示时将按钮面板添加到每张卡上,这可能会造成混乱和闪烁
  • 使每张卡的左上角透明,使其显示父卡拥有的左上角按钮面板。但是我该怎么做呢
  • 其他解决方案

    也许吧

  • 有两个由单选按钮控制的卡片布局面板。右上角包含按钮面板和位于两者下方的下部组件以外的所有组件
  • 您可以使用显示卡面板左上角的控制面板

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


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

    选择列表可以是收音机、按钮,或者在本例中是一个项目列表,这些项目可能会在布局混乱的情况下增长。例如:

    /*
     * 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

    我会忘记透明度的概念。只需将选项作为列表放在卡面板的左侧(或右侧,或上方/下方)。我绝对不会把控制面板放在CardPanel上。应该在外面

    选择列表可以是收音机、按钮,或者在本例中是一个项目列表,这些项目可能会在布局混乱的情况下增长。例如:

    /*
     * 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

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

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

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

    设置图层后,仍需在x、y空间中正确定位两个面板。我建议只使用以下内容覆盖JLayeredPane的doLayout()方法(尚未测试):


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

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

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

    设置图层后,仍需在x、y空间中正确定位两个面板。我建议只使用以下内容覆盖JLayeredPane的doLayout()方法(尚未测试):


    我喜欢这个,它是简单的设置,看起来它会工作;另请看这个相关的。我喜欢这个,它的设置很简单,看起来它会起作用。+1不错的选择;另请看这篇相关文章。是的,透明度就像一罐蠕虫。我同意这些按钮不属于卡片上。但上面user2734169的解决方案更简单。尽管如此,还是要谢谢你。是的,透明度是一堆虫子。我同意这些按钮不属于卡片上。但上面user2734169的解决方案更简单。尽管如此,还是要谢谢你。