我目前正在开发一个 Java Swing 应用程序。我想用aJLayer来装饰aJPanel但是卡住了。
现在我要将 a 添加JTextArea到 a中JPanel,然后将 the 添加JPanel到 aJLayer中,最后添加到 a 中JScrollPane。A是必须的,因为我想在(将添加到自定义组件, )JPanel旁边添加额外的组件。问题是它不会自动扩展而是缩小到 (0, 0) 大小。JTextAreaJTextAreaBorderLayout.CENTERBorderLayout.LINE_STARTJPanel
我已经想到了一些解决方法,但它们不太合适。
(1) 将a添加JScrollPane到the中,直接JLayer将the添加JLayer到顶层容器中。然而,JLayer也涵盖了,JScrollPane而我只希望它涵盖JTextArea.
(2) 避免使用 aJPanel并寻找其他方法在 旁边添加自定义组件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):

那么如何才能达到正确的结果呢?提前感谢您的解决方案。