我正在尝试将JLayeredPane添加到JPanel,然后将图像(JLabel图标)和按钮添加到JLayeredPane,但都没有显示.我已经在没有按钮和分层窗格的情况下测试了图像,所以我知道它有效.这是我正在使用的一些代码.有什么我遗失或做错了吗?
public class MyClass extends JPanel
{
private JLayeredPane layeredPane;
private JLabel imageContainer = new JLabel();
private JButton info = new JButton("i");
MyClass(ImageIcon image)
{
super();
this.imageContainer.setIcon(image);
this.layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new Dimension(300, 300));
layeredPane.add(imageContainer, new Integer(50));
layeredPane.add(info, new Integer(100));
this.add(layeredPane);
}
}
情况:抽一堆扑克牌,就像纸牌游戏一样。堆放得很好。
为了实现这一点,我JLayeredPane结合使用了接口的自定义实现LayoutManager。使用自定义 LayoutManager 的原因是堆栈方向各不相同,有时扑克牌完全相互覆盖,有时部分覆盖,这种逻辑对于 LayoutManager 来说似乎是一个很好的工作,因为这基本上可以归结为设置扑克牌的位置牌。
因此,它LayoutManager负责设置堆栈中所有组件的 X 和 Y 坐标。另一方面JLayeredPane负责它们的 Z 坐标(通过其层)。
将组件添加到 a 中的JLayeredPane过程如下:
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
Run Code Online (Sandbox Code Playgroud)
哪里new Integer(j)是卡片的层。这一定是Integer由于 的合同造成的JLayeredPane。
这里的问题是,由于上述原因, myStackLayout不能有除 an 之外的任何其他约束对象。Integer该LayoutManager接口要求您实现以下方法:
addLayoutComponent(Component comp, Object constraints);
Run Code Online (Sandbox Code Playgroud)
并且过去Object的将永远是一个Integer。
在我的特殊情况下,我很幸运,因为我的 XY 坐标可以根据 Z 坐标计算出来。例如,图层中的卡片k必须位于 Y 坐标k * offset。所以在我的情况下,约束对象是一个Integer不是问题。 …
我正在开发一款国际象棋游戏.我想让Board Container利用GridLayout来显示一个8x8的JPanel网格.(这将使突出显示所选方块和有效移动等功能变得更加容易.)然后,我想在这一层上添加碎片,以便可以拖放它们.我最初通过在单个正方形JPanel中绘制它们来显示这些碎片,但是当我试图稍后拖放它们时会发现这个问题.我一直试图使用JLayeredPane作为主要容器,但遇到了几个问题.
一个是,一旦我为JLayeredPane指定了GridLayout,无论我使用哪个Integer来指定要添加JLabel或其他类型图像的图层,都会将这些部分添加到网格中,使其位置设置和扭曲整个董事会.我已经读过使用LayoutManagers会干扰JLayeredPane上的图层定位,所以这并不太令人惊讶.(虽然来自JLayeredPane教程的Oracle演示程序似乎做得很好:http://download.oracle.com/javase/tutorial/uiswing/examples/components/LayeredPaneDemo2Project/src/components/LayeredPaneDemo2.java)
但是,我也尝试将JPanel的网格放入自己的JPanel中,然后将其添加到JLayeredPane的低层,这个想法是我可以将拖放图标添加到更高的单独的非透明JPanel上JLayeredPane的一层.然而,当我这样做之后,在JLayeredPane中只有网格JPanel之后(即在添加拖放图层之前),网格将不会显示.
我也尝试覆盖JLayeredPane的paintComponent(和paint)方法来绘制片段图像,但它们被JPanels隐藏(我可以看到它们确实在那里通过将JPanels设置为非不透明)并且就其而言我可以告诉你没有选择在JLayeredPane上设置图形层.我也尝试使用框架的glassPane来绘制碎片,但也有不受欢迎的行为.
任何帮助解释这些行为,或我出错的地方,将不胜感激!
我正在尝试逐步建立基于用户输入的图像.我正在尝试做的是创建一堆图形并将它们添加为图层但是我遇到了一些问题,因为它们不会显示出来.这是我正在使用的代码:
public class ClassA
{
protected final static int dimesionsY = 1000;
private static int dimesionsX;
private static JFrame window;
private static JLayeredPane layeredPane;
public void init()
{
window = new JFrame("Foo");
dimesionsX = // some user input
window.setPreferredSize(new Dimension(dimesionsX, dimesionsY));
window.setLayout(new BorderLayout());
layeredPane = new JLayeredPane();
layeredPane.setBounds(0, 0, dimesionsX, dimesionsY);
window.add(layeredPane, BorderLayout.CENTER);
ClassB myGraphic = new ClassB();
myGraphic.drawGraphic();
layeredPane.add(myGrpahic, new Integer(0), 0);
window.pack();
window.setVisible(true);
}
}
public class ClassB extends JPanel
{
public void drawGraphic()
{
repaint();
}
public …Run Code Online (Sandbox Code Playgroud) 我正在Java Swing中创建一个虚拟钢琴类型程序.我现在的钢琴键区域是一个JPanel,其水平BoxLayout包含白色JButtons作为白键.我也想添加黑键,让它们与白键重叠.
我尝试过两种不同的方法.一个是使用OverlayLayout.遗憾的是,OverlayLayout管理器在线没有太多文档,并且在NetBeans GUI构建器中不可用.我不知道如何让它发挥作用.我尝试过的第二件事是使用JLayeredPanes.即使在Netbeans中弄乱它之后,我似乎无法想出那个.
所以我认为我的问题非常简单.如果有的话,在其他JButton之上添加JButton的最佳方法是什么?或者也许有一个替代使用JButtons钢琴键?
编辑
我结合了aioobe和dacwe的代码来获得我想要的结果.我基本上使用dacwe的z-ordering与aioobe的基本尺寸(按比例放大)和mod 7部分.我还添加了一些变量以使事情更加清晰.这就是我现在拥有的.
import javax.swing.*;
import java.awt.Color;
public class Test2 {
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
JLayeredPane panel = new JLayeredPane();
frame.add(panel);
int maxKeys = 8;
int width = 60;
int height = 240;
for (int i = 0; i < maxKeys; i++) {
JButton b = new JButton();
b.setBackground(Color.WHITE);
b.setLocation(i * width, 0);
b.setSize(width, height);
panel.add(b, 0, -1);
}
int width2 = 48;
int height2 = 140;
for …Run Code Online (Sandbox Code Playgroud) 我想将来自 JTable 的对象分层放置在 JTable 之上,因此使用 JLayeredPane 似乎很自然。然而,让它正确地绘制,正确地做标题等是非常困难的。我该如何做到这一点,以便:
请注意,由于JDesktopPaneextends JLayeredPane,此问题的答案还允许您JTable在 . 后面有一个(或任何其他组件)JDesktopPane。
我需要一个JToggleButton(具有自定义背景),其中包含一个JPanel,其中包含多个JLabel.那部分有效.
此按钮随后放在JTable单元格中,并由用户按下.问题是我只能在第二次点击时按下按钮.在第一次点击时,首先使用JLabel跳转到面板,然后再转到实际按钮.
我尝试了几件事来尝试解决这个问题,但同样的问题仍然存在.A)将带有标签的JPanel直接放在JToggleButton#add()上.B)使用JLayeredPane将Button和JPanel放置到不同的层上,其中JToggleButton采用约束整数( - ),以便具有JLabel的JPanel保持在顶部可见
你有什么建议吗?谢谢
下面是一个示例代码,说明了该问题.单击该按钮仅适用于第二次.
public class ClickableCustomButtonInTable extends JToggleButton {
public ClickableCustomButtonInTable() {
Dimension d = new Dimension(100, 100);
JLabel lFirst = new JLabel("1st label");
lFirst.setPreferredSize(d);
JLabel lSecond = new JLabel("2nd label");
lSecond.setPreferredSize(d);
JPanel panel = new JPanel();
panel.setOpaque(true);
panel.setLayout(new BorderLayout());
panel.add(lFirst, BorderLayout.NORTH);
panel.add(lSecond, BorderLayout.SOUTH);
add(panel);
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked");
}
});
}
private static class CustomButtonRenderer implements TableCellRenderer {
private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();
@Override
public Component …Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,它有一个JLayeredPane(称之为图层),包含两个不同层的JPanel.我覆盖了底部JPanel的paintComponent方法(称之为grid_panel),因此它绘制了一个网格,并在顶部绘制了一个paintComponent方法(称之为circuit_panel),因此它绘制了一个电路.
以下是结构摘要:
layers -
|-circuit_panel (on top)
|-grid_panel (at bottom)
Run Code Online (Sandbox Code Playgroud)
我希望grid_panel保持静态,即不进行任何重绘(除了初始的重绘),因为它不会改变.
麻烦的是,每当我调用circuit_panel.repaint()时,grid_panel也会被重新绘制! 这绝对不是有效的.
我认为这是由于JLayeredPane的热切绘画行为.有没有办法在JLayeredPane中禁用此功能?
如果你有兴趣看到上述效果,我写了一个小的演示程序:
public class Test2 extends JFrame {
public Test2() {
JLayeredPane layers = new JLayeredPane();
layers.setPreferredSize(new Dimension(600, 400));
MyPanel1 myPanel1 = new MyPanel1();
MyPanel2 myPanel2 = new MyPanel2();
myPanel1.setSize(600, 400);
myPanel2.setSize(600, 400);
myPanel1.setOpaque(false);
myPanel2.setOpaque(false);
myPanel2.addMouseListener(new MyMouseListener(myPanel2));
layers.add(myPanel1, new Integer(100)); // At bottom
layers.add(myPanel2, new Integer(101)); // On top
this.getContentPane().add(layers, BorderLayout.CENTER);
this.setSize(600, 400);
}
class MyPanel1 extends JPanel {
Color getRandomColor() {
int r = (int) …Run Code Online (Sandbox Code Playgroud) 我对玻璃窗格和分层窗格之间的区别总是有点模糊.玻璃窗格基本上只是"根窗格的最顶层",还是表现不同?您何时使用分层窗格而不是玻璃窗格?
我正在创建一个程序,我可以在其中绘制地图并添加不同的道路等.我计划在一个jpanel上添加地图地形,在另一个jpanel上添加道路等,相互叠加.但我无法让他们工作.我不知道如何将多个jpanel完全叠加在一起并使它们都能够绘制.
java ×10
jlayeredpane ×10
swing ×9
jpanel ×2
jtable ×2
chess ×1
constraints ×1
glasspane ×1
graphics ×1
jbutton ×1
jlayer ×1
jscrollpane ×1
overlap ×1
paint ×1
repaint ×1