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