将JPanel添加到JLayer中的问题

时间:2015-06-12 06:29:26

标签: java swing jpanel jtextarea jlayer

我目前正在开发Java Swing应用程序。我想使用JLayer来装饰JPanel但是卡住了。

现在我要在JTextArea中添加JPanel,然后将JPanel添加到JLayer,最后添加到JScrollPaneJPanel是必须的,因为我想在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);
            }
        });
    }
}

结果:

enter image description here

我的解决方法(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):

enter image description here

那么如何实现正确的结果呢?感谢提前解决方案。

0 个答案:

没有答案