Java 通过顶部的面板显示背景图像

Java 通过顶部的面板显示背景图像,java,swing,jpanel,transparency,Java,Swing,Jpanel,Transparency,在面板中添加面板和对象时,我希望将图像设置为背景,并通过放置在其顶部的面板显示。我听说你可以通过设置面板.setOpaque(false)选项来下注,但是这似乎不起作用 这是我的编译器目录及其设置方式(使用Intellij) 这是背景图片 这是代码 背景面板类> 我知道图像背景正在添加到gui中,因为如果我注释掉行//add(topFrame,BorderLayout.NORTH)和//添加(centerFrame,BorderLayout.CENTER)在构造函数中,图像显示在gui上。有

在面板中添加面板和对象时,我希望将图像设置为背景,并通过放置在其顶部的面板显示。我听说你可以通过设置
面板.setOpaque(false)
选项来下注,但是这似乎不起作用

这是我的编译器目录及其设置方式(使用Intellij)

这是背景图片

这是代码

背景面板类>


我知道图像背景正在添加到gui中,因为如果我注释掉行
//add(topFrame,BorderLayout.NORTH)
//添加(centerFrame,BorderLayout.CENTER)在构造函数中,图像显示在gui上。有人知道如何通过这两个面板显示背景图像吗?

您正在将
背景框
替换为
中心框

add(backgroundFrame);
add(topFrame, BorderLayout.NORTH);
add(centerFrame, BorderLayout.CENTER);
这是
BorderLayout
的功能,它只能在5个可用位置中的每个位置支持单个组件

相反,您要做的是将其他面板添加到
backgroundFrame
,或者将
backgroundFrame
设置为框架的
contentPane

setContentPane(backgroundFrame);
add(topFrame, BorderLayout.NORTH);
add(centerFrame, BorderLayout.CENTER);

另外,作为一个一般性建议,避免使用
setPreferredSize
,因为有太多的事情可能会导致错误


很抱歉再次打扰您,它似乎没有通过JScrollPane显示。我应该把这个问题作为一个新问题来回答吗

JScrollPane
是一个更复杂的组件,它由两个用于提供滚动功能的组件组成

您需要使
JScrollPane
JViewport
透明(以及包装到其中的视图)

因此,这是
createCenterFrame
方法的一个修改版本,该方法创建
JTextArea
,包装成
JScrollPane
并将其添加到
pnl

private JPanel createCenterFrame() {
    JPanel pnl = new JPanel();
    Border raisedBevel = BorderFactory.createRaisedBevelBorder();
    Color lineColor = new Color(224, 224, 224);
    Border lineBorder = BorderFactory.createMatteBorder(5, 5, 5, 5, lineColor);
    Border loweredBevel = BorderFactory.createLoweredBevelBorder();
    Border compoundSetup = BorderFactory.createCompoundBorder(raisedBevel, lineBorder);
    Border compoundFinal = BorderFactory.createCompoundBorder(compoundSetup, loweredBevel);
    TitledBorder topFrameTitle = BorderFactory.createTitledBorder(compoundFinal, "Stuff");
    topFrameTitle.setTitleJustification(TitledBorder.CENTER);

    pnl.setBorder(topFrameTitle);
    pnl.setLayout(new BorderLayout());

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setOpaque(false);
    scrollPane.getViewport().setOpaque(false);

    JTextArea ta = new JTextArea();
    ta.setOpaque(false);
    ta.setText("This is an example of a transparent text area inside a transparent scroll pane, but you could just as easily wrap a transparent panel into it and get the same result");
    ta.setWrapStyleWord(true);
    ta.setLineWrap(true);

    scrollPane.setViewportView(ta);

    pnl.add(scrollPane);

    pnl.setOpaque(false);
    return pnl;
}

您正在将
背景框
替换为
中心框

add(backgroundFrame);
add(topFrame, BorderLayout.NORTH);
add(centerFrame, BorderLayout.CENTER);
这是
BorderLayout
的功能,它只能在5个可用位置中的每个位置支持单个组件

相反,您要做的是将其他面板添加到
backgroundFrame
,或者将
backgroundFrame
设置为框架的
contentPane

setContentPane(backgroundFrame);
add(topFrame, BorderLayout.NORTH);
add(centerFrame, BorderLayout.CENTER);

另外,作为一个一般性建议,避免使用
setPreferredSize
,因为有太多的事情可能会导致错误


很抱歉再次打扰您,它似乎没有通过JScrollPane显示。我应该把这个问题作为一个新问题来回答吗

JScrollPane
是一个更复杂的组件,它由两个用于提供滚动功能的组件组成

您需要使
JScrollPane
JViewport
透明(以及包装到其中的视图)

因此,这是
createCenterFrame
方法的一个修改版本,该方法创建
JTextArea
,包装成
JScrollPane
并将其添加到
pnl

private JPanel createCenterFrame() {
    JPanel pnl = new JPanel();
    Border raisedBevel = BorderFactory.createRaisedBevelBorder();
    Color lineColor = new Color(224, 224, 224);
    Border lineBorder = BorderFactory.createMatteBorder(5, 5, 5, 5, lineColor);
    Border loweredBevel = BorderFactory.createLoweredBevelBorder();
    Border compoundSetup = BorderFactory.createCompoundBorder(raisedBevel, lineBorder);
    Border compoundFinal = BorderFactory.createCompoundBorder(compoundSetup, loweredBevel);
    TitledBorder topFrameTitle = BorderFactory.createTitledBorder(compoundFinal, "Stuff");
    topFrameTitle.setTitleJustification(TitledBorder.CENTER);

    pnl.setBorder(topFrameTitle);
    pnl.setLayout(new BorderLayout());

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setOpaque(false);
    scrollPane.getViewport().setOpaque(false);

    JTextArea ta = new JTextArea();
    ta.setOpaque(false);
    ta.setText("This is an example of a transparent text area inside a transparent scroll pane, but you could just as easily wrap a transparent panel into it and get the same result");
    ta.setWrapStyleWord(true);
    ta.setLineWrap(true);

    scrollPane.setViewportView(ta);

    pnl.add(scrollPane);

    pnl.setOpaque(false);
    return pnl;
}

首先在面板上调用
setOpaque(false)
,即
pnl.setOpaque(false)
。您会发现默认情况下很多组件都是不透明的(除了
JLabel
,因为它必须不同),这就是我在第139行和第153行
pnl.setOpaque(false)中尝试的方法。它似乎不起作用…首先在面板上调用
setOpaque(false)
,即
pnl.setOpaque(false)
。您会发现默认情况下很多组件都是不透明的(除了
JLabel
,因为它必须不同),这就是我在第139行和第153行
pnl.setOpaque(false)中尝试的方法。它似乎不起作用…耶!再次感谢(感谢营救!!!)。swing库有很多方法我必须学习,天啊:)很抱歉再次打扰你,它看起来没有通过JScrollPane显示出来。我应该把这个问题作为一个新问题来回答吗?@FiddleFreak更复杂,请参阅,有关更多详细信息,我认为最好的解决方案是在scrollpane
JScrollPane scrollpane=new JScrollPane(backgroundFrame)中将图像设置为自己的背景。然后将面板添加到滚动窗格的内部,并使用以下行
scrollPane.setOpaque(false)
scrollPane.getViewport().SetObaque(false),和
滚动窗格.getViewport().setView(topFrame)。我不确定这是否是最好的方式,但它正好显示了我想要的方式。如果在滚动窗格中包装
backgroundFrame
,则不需要将其设置为透明。调用
setView
将用
topFrame
替换
backgroundFrame
。。。所以并不像你想象的那样工作。解决方案将取决于您希望实现的目标!再次感谢(感谢营救!!!)。swing库有很多方法我必须学习,天啊:)很抱歉再次打扰你,它看起来没有通过JScrollPane显示出来。我应该把这个问题作为一个新问题来回答吗?@FiddleFreak更复杂,请参阅,有关更多详细信息,我认为最好的解决方案是在scrollpane
JScrollPane scrollpane=new JScrollPane(backgroundFrame)中将图像设置为自己的背景。然后将面板添加到滚动窗格的内部,并使用以下行
scrollPane.setOpaque(false)
scrollPane.getViewport().SetObaque(false),和
滚动窗格.getViewport().setView(topFrame)。我不确定这是否是最好的方式,但它正好显示了我想要的方式。如果在滚动窗格中包装
backgroundFrame
,则不需要将其设置为透明。调用
setView
将用
topFrame
替换
backgroundFrame
。。。