我目前正在开发一个 Java Swing 应用程序。我想用aJLayer
来装饰aJPanel
但是卡住了。
现在我要将 a 添加JTextArea
到 a中JPanel
,然后将 the 添加JPanel
到 aJLayer
中,最后添加到 a 中JScrollPane
。A是必须的,因为我想在(将添加到自定义组件, )JPanel
旁边添加额外的组件。问题是它不会自动扩展而是缩小到 (0, 0) 大小。JTextArea
JTextArea
BorderLayout.CENTER
BorderLayout.LINE_START
JPanel
我已经想到了一些解决方法,但它们不太合适。
(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
):
那么如何才能达到正确的结果呢?提前感谢您的解决方案。