私は現在、Java Swing アプリケーションに取り組んでいます。JLayer
を使ってを飾りたいけどJPanel
行き詰まる。
次に、 aJTextArea
を aJPanel
に追加し、次に をa に追加し、最後にJPanel
aに追加します。の横に追加のコンポーネントを追加したいので、Aは必須です(はカスタム コンポーネントに追加されます)。問題は、自動的に拡大せず、(0, 0) サイズに縮小することです。JLayer
JScrollPane
JPanel
JTextArea
JTextArea
BorderLayout.CENTER
BorderLayout.LINE_START
JPanel
いくつかの回避策を考えましたが、あまり適していません。
(1) に aJScrollPane
を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);
}
});
}
}
結果:
私の回避策(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
):
では、正しい結果を得るにはどうすればよいでしょうか。事前に解決策をありがとう。