我目前正在开发Java Swing应用程序。我想使用JLayer
来装饰JPanel
但是卡住了。
现在我要在JTextArea
中添加JPanel
,然后将JPanel
添加到JLayer
,最后添加到JScrollPane
。 JPanel
是必须的,因为我想在JTextArea
旁边添加额外的组件(JTextArea
将添加到BorderLayout.CENTER
和自定义组件BorderLayout.LINE_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);
}
});
}
}
结果:
我的解决方法(1):
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);
}
});
}
}
这似乎有效,但JLayer
绘画将覆盖JScrollPane
的滚动条,这不是首选。
(覆盖JScrollPane
:子类LayerUI
的示例:)
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());
}
}
滚动(JScrollPane
所涵盖的JLayer
):
那么如何实现正确的结果呢?感谢提前解决方案。