1

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

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

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

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

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

其他解决方案?

也许

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

3 回答 3

2

听起来您可以使用 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() ));
}
于 2013-08-30T20:17:52.153 回答
1

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

图片

于 2013-08-30T19:31:38.583 回答
1

我会忘记透明度的想法。只需将选项作为列表放在卡片面板的左侧(或右侧,或上方/下方)。我绝对不会将控件面板放在 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作为替代方案。

于 2013-08-30T19:40:30.303 回答