2

私は現在、Java Swing アプリケーションに取り組んでいます。JLayerを使ってを飾りたいけどJPanel行き詰まる。

次に、 aJTextAreaを aJPanelに追加し、次に をa に追加し、最後にJPanelaに追加します。の横に追加のコンポーネントを追加したいので、Aは必須です(はカスタム コンポーネントに追加されます)。問題は、自動的に拡大せず、(0, 0) サイズに縮小することです。JLayerJScrollPaneJPanelJTextAreaJTextAreaBorderLayout.CENTERBorderLayout.LINE_STARTJPanel

いくつかの回避策を考えましたが、あまり適していません。

(1) に aJScrollPaneJLayer追加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):

ここに画像の説明を入力

では、正しい結果を得るにはどうすればよいでしょうか。事前に解決策をありがとう。

4

0 に答える 0