2

我目前正在开发一个 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):

在此处输入图像描述

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

4

0 回答 0