Java 将JPanel添加到JLayer中的问题
我目前正在开发一个JavaSwing应用程序。我想用Java 将JPanel添加到JLayer中的问题,java,swing,jpanel,jtextarea,jlayer,Java,Swing,Jpanel,Jtextarea,Jlayer,我目前正在开发一个JavaSwing应用程序。我想用JLayer装饰JPanel,但是卡住了 现在我要将JTextArea添加到JPanel中,然后将JPanel添加到JLayer中,最后添加到JScrollPane中。必须使用JPanel,因为我想在JTextArea旁边添加额外的组件(将JTextArea添加到BorderLayout.CENTER和自定义组件BorderLayout.LINE\u START)。问题在于JPanel不会自动展开,而是缩小到(0,0)大小 我已经想到了一些变通
JLayer
装饰JPanel
,但是卡住了
现在我要将JTextArea
添加到JPanel
中,然后将JPanel
添加到JLayer
中,最后添加到JScrollPane
中。必须使用JPanel
,因为我想在JTextArea
旁边添加额外的组件(将JTextArea
添加到BorderLayout.CENTER
和自定义组件BorderLayout.LINE\u START
)。问题在于JPanel
不会自动展开,而是缩小到(0,0)大小
我已经想到了一些变通办法,但它们不太合适
(1) 将JScrollPane
添加到JLayer
中,并将JLayer
直接添加到顶级容器中。但是JLayer
还包括JScrollPane
,而我只希望它包括JTextArea
(2) 避免使用JPanel
,并寻找其他方法在JTextArea
旁边添加自定义组件,但我想不出任何简单的方法来实现它
代码如下:
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;
public class Test
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
//add JLayer
JTextArea textArea = new JTextArea("JTextArea blah blah blah");
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(Color.RED);
panel.add(textArea, BorderLayout.CENTER);
JLayer<JPanel> layer = new JLayer<JPanel>(panel, new LayerUI<JPanel>());
frame.add(new JScrollPane(layer), BorderLayout.CENTER);
//setup frame and show
frame.setSize(250,250);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
滚动时(JScrollPane
被JLayer
覆盖):
那么,如何获得正确的结果呢?感谢您提前提供解决方案。那么您的问题是
JPanel
没有扩展?你试过使用不同的布局吗?我不能在jlayer上调用setLayout(new BorderLayout()),你可以将层中的绘画剪裁到不包含滚动条的区域,我知道,但我更愿意找出我的代码不能按预期工作的原因。此外,这不是一个非常优雅的方法。=)
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;
public class Test
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
//add JLayer
JTextArea textArea = new JTextArea("JTextArea blah blah blah");
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(Color.RED);
panel.add(textArea, BorderLayout.CENTER);
JLayer<JScrollPane> layer = new JLayer<JScrollPane>(new JScrollPane(panel), new LayerUI<JScrollPane>());
frame.add(layer, BorderLayout.CENTER);
//setup frame and show
frame.setSize(250,250);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
new LayerUI<JScrollPane>()
{
@Override
public void paint(Graphics g, JComponent c)
{
super.paint(g,c);
g.setColor(new Color(255,0,0,50));
g.fillRect(0,0,c.getWidth(),c.getHeight());
}
}