JPanel
私は、その境界の外に描画できると期待していた単純な拡張機能を設計しました:
public class JGlassPanel extends JPanel {
@Override
protected void paintBorder(Graphics g) {
}
@Override
protected void paintComponent(Graphics g) {
if( getParent() != null ) {
g.setClip(-getX(), -getY(), getX() + getWidth(), getY() + getHeight());
}
super.paintComponent(g);
}
}
このクラスのテストでは、部分的にしか機能しないことが示されました (以下のコード)。たとえば、ボタンはパネルの外側に描画されますが、背景は境界の内側に感じられ、ボタンの視覚効果も境界の内側に感じられます。
すべての視覚的特徴を任意の領域に拡張することは可能ですか?
アップデート
作成されたボタンをオーバーライドcontains
すると、パネルの外側でも機能することがわかりました(クリックに反応します)。一方、視覚効果と背景はまだコンポーネントの境界内にあります。
使用コード
public class Tester_JGlassPanel_01 {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JButton button = new JButton("my button");
button.setBounds(-50, -20, 100, 40);
JGlassPanel panel = new JGlassPanel();
//JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.RED);
panel.setBounds(100, 100, 100, 100);
panel.add(button);
JFrameEx frame = new JFrameEx();
frame.setLayout(null);
frame.add(panel);
frame.setSize(0.5);
frame.center();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}