- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力做一些我认为很简单的事情:
我想创建一个带有背景图像的表单(JTextField)。为了使表单不覆盖背景图像,我使用 JLayeredPane。我一直在尝试不同的东西,似乎没有任何效果:出于某种原因,我要么只显示背景,要么只显示 JTextField,但从来不会同时显示两者。我的目标是拥有一个永远不会改变的背景图像,并且只需在其顶部使用我的按钮/文本字段。
package gestion;
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Main extends JFrame{
JLayeredPane layeredPane;
JPanel board;
JPanel background;
public Main(){
super("Test");
background = new JPanel();
layeredPane = new JLayeredPane();
board = new JPanel();
// Creating frame with LayeredPane
Dimension boardSize = new Dimension(1280, 1024);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setSize(boardSize.width, boardSize.height);
this.setVisible(true);
this.setLocationRelativeTo(null);
layeredPane.setPreferredSize( boardSize );
this.add(layeredPane);
// Add a background to the Layered Pane
JLabel picLabel = new JLabel(new ImageIcon("background.jpg"));
background.add(picLabel);
background.setPreferredSize(boardSize);
background.setBounds(0,0,boardSize.width, boardSize.height);
layeredPane.add(background, JLayeredPane.DEFAULT_LAYER);
// Add a JTextField
final JTextField jtf = new JTextField("Default Value");
Font police = new Font("Arial", Font.BOLD, 14);
jtf.setFont(police);
jtf.setPreferredSize(new Dimension(600, 800));
background.setBounds(0,0,boardSize.width, boardSize.height);
jtf.setForeground(Color.BLUE);
board.add(jtf);
layeredPane.add(board, JLayeredPane.PALETTE_LAYER);
}
public static void main(String[] args)
{
new Main();
}
}
似乎只出现了图像,并且由于某种原因(我最好的选择是黑魔法)JTextField 不存在。任何想法或帮助将不胜感激!谢谢!
最佳答案
任何时候您依赖任何使用 null
布局的内容(例如 JLayeredPane
),您都会遇到问题。
你应该使用类似...的东西
board.setBounds(new Rectangle(new Point(0, 0), board.getPreferredSize()));
layeredPane.add(board, JLayeredPane.PALETTE_LAYER);
设置板
的大小和位置。
null
布局还存在一系列其他问题,这只会让它们在代码中变得非常痛苦,最终浪费的时间比节省的时间还要多......
坦率地说,一个更简单、更可用的解决方案是创建一个自定义组件,它可以为您绘制背景图像,这样,您就可以使用您需要的任何布局管理器,而不会遇到这些问题。在有人跳到我面前之前,您“可以”使用带有 JLayeredPane 的布局管理器,但这会带来更多问题,因为必须让组件重叠,以便背景层可以充当背景。 ..只是更加困惑
另外,在有人跳到我身上之前,您可以使用 JLabel
作为背景组件,在其上设置布局管理器并向其中添加您的组件,但是 JLabel
code> 不会根据其包含的子组件计算所需的大小,而是使用 icon
和 text
属性。如果您的背景图像足够大,这可能不是问题,但总是看起来像是一个等待突破的弱点。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
BackgroundPane bgPane = new BackgroundPane();
bgPane.setLayout(new GridBagLayout());
add(bgPane);
try {
BufferedImage bg = ImageIO.read(new File("C:\\Users\\shane\\Dropbox\\MegaTokyo\\thumnails\\megatokyo_omnibus_1_3_cover_by_fredrin-d4oupef.jpg"));
bgPane.setBackgroundImage(bg);
} catch (IOException ex) {
ex.printStackTrace();
}
JLabel show = new JLabel("Bananas are yellow");
show.setOpaque(true);
show.setForeground(Color.RED);
show.setBackground(Color.YELLOW);
show.setBorder(new EmptyBorder(20, 20, 20, 20));
bgPane.add(show);
}
}
public class BackgroundPane extends JPanel {
private BufferedImage img;
@Override
public Dimension getPreferredSize() {
BufferedImage img = getBackgroundImage();
Dimension size = super.getPreferredSize();
if (img != null) {
size.width = Math.max(size.width, img.getWidth());
size.height = Math.max(size.height, img.getHeight());
}
return size;
}
public BufferedImage getBackgroundImage() {
return img;
}
public void setBackgroundImage(BufferedImage value) {
if (img != value) {
BufferedImage old = img;
img = value;
firePropertyChange("background", old, img);
revalidate();
repaint();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage bg = getBackgroundImage();
if (bg != null) {
int x = (getWidth() - bg.getWidth()) / 2;
int y = (getHeight() - bg.getHeight()) / 2;
g.drawImage(bg, x, y, this);
}
}
}
}
此实现缺少自动缩放或重复等功能,但您明白了
关于java - 创建带有背景图像的表单(JLayeredPane),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28889667/
我正在尝试创建一个带有 JLayeredPane 的应用程序,该应用程序会根据父 JFrame 的大小自动缩放(这是使用 BorderLayout 作为框架内容 Pane 上的布局管理器)。困难的部分
是否可以在JTable内添加JLayeredPane()? 我尝试过: JLayeredPane agentPicturePane = new JLayeredPane(); St
我一直在努力做一些我认为很简单的事情: 我想创建一个带有背景图像的表单(JTextField)。为了使表单不覆盖背景图像,我使用 JLayeredPane。我一直在尝试不同的东西,似乎没有任何效果:出
我正在使用 JLayeredPane 来定位我的 JPanel 3 维,这样当有人单击 jpanel 时我可以实现“缩放”效果,我需要动态更改图层索引,以便单击的组件始终是在上面”。 JPanel j
我有一个 JLayeredPane。我在上面放置了几个组件。这些组件是扩展 jPanel 的类。所有组件都放置在同一深度层中。每个组件可能有也可能没有完全/部分位于其上方/下方的其他组件。当我单击组件
我有以下问题:我有一个 JLayeredPane,我需要向其中添加一个圆和一些线条。线条的问题是,它们应该能够重绘/移动位置(线条象征一些移动 vector )当我只是将一些 GLine 添加到 Gr
我有一个有两层的 JLayeredPane。顶层是完全透明的,充当玻璃 Pane ,捕获鼠标事件,然后将它们分派(dispatch)到其下方的 Pane 。由于未知原因,底层未正确绘制。我是否必须向其
我正在尝试创建一个面板,该面板使用 JLayeredPane 使面板位于另一个更大的面板上方的中心。但我似乎无法显示较小的面板。关于我做错了什么有什么想法吗? import java.awt.Dime
我有一个多层 java 应用程序,其中包含一系列需要手形光标的 JLabel 按钮,例如: button.setCursor(Cursor.getPredefinedCursor(Cursor.HAN
我有一个从 JFrame 扩展的类。我里面有多个 JLayeredPanes。我想从一个 JLayeredPane 切换到另一个。为此,我所做的是; 删除当前的 JLayeredPane,如 remo
我在 NetBeans 中有一个项目,它使用分层 Pane 通过在必要时在它们之间切换来显示重叠的面板。启动时,程序会在其中一个面板上显示介绍动画(在单独的线程上运行),通过以下方式实现: publi
我在 JLayeredPane 上有一些按钮和面板。 当我点击一个按钮时,一个面板通过 setvisible(true) 显示。但是,如果面板后面有一个按钮,并且我将鼠标悬停在按钮上,按钮就会出现在面
我的 JLayeredPane 有问题,我可能正在做一些非常简单的事情,但我无法全神贯注。我遇到的问题是所有组件都合并在一起并且没有排序。你能纠正这个吗,因为我不知道。我尝试执行的顺序是这样的布局 输
我有一个图像,我想要的只是将此图像打包到 JLabel 中,并将其添加到我的 JLayeredPane 中,以便稍后对多个图像进行分层。它可以在没有 JLayeredPane 的情况下处理一张图像,但
我想在运行时动态添加/隐藏/删除 jlayeredpanes,并且在选择另一个 Pane 时还应该隐藏每个 Pane 上的内容。我已经尝试过以下代码,但我不知道如何执行此操作。以下代码在选择备用 Pa
我有一个代码,可以在鼠标单击时在 jLayeredpane 中的单击位置添加 jbutton。现在问题出在调整大小上。当我在运行时不更改 jLayeredpane 的大小时,就没有问题。当我最大化窗口
我在分层 Pane 中有一组面板。我需要一个分隔符来将 sideBar 与 topBar 和 tabbedPanel 分开。我留了一个 10 像素的缓冲区来放置它。不幸的是,可能由于它是 JLayer
我需要一个 UI,我想在其中描绘网络设备的图形表示。为此,我只是加载多个图像并将它们一一重叠以显示设备的当前状态。我必须支持此 View 的缩放。缩放代码如下所示。 public void zoom(
在这里尝试分层 Pane ,但遇到了问题。我有两个 JPanel。我将它们都添加到 JLayeredPane 中 - panel1 足够大,可以占据整个空间,而 panel2 较小,并且使用 Flow
我正在尝试使用 JLayeredPane 将一个 JPanel 覆盖在另一个 JPanel 之上。由于某种原因,添加的面板没有显示。 这是创建 JLayeredPane 并向其中添加元素的代码: im
我是一名优秀的程序员,十分优秀!