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