4

ボタンのあるJPanelがあります。ボタンの位置は関係ありません。paint(Graphics g)コードは次のとおりです。

    @オーバーライド
    public void paint(Graphics g){
        super.paint(g);
        /*描画コード*/
    }

パネルにボタンを配置しながら、パネルのスペース全体を黒い長方形で塗りつぶしたい場合、塗りつぶされた長方形はすべてを単純に覆います。したがって、ボタンを配置してからボタン全体を黒くするのではなく、パネル全体を黒くします。

コンポーネントがカスタムペイントの上に描画されるように、パネルまたはペイント手順を変更する方法はありますか?

super.paint(g)私は絵の最後に次のように入れようとしました:

    @オーバーライド
    public void paint(Graphics g){
        /*描画コード*/
        super.paint(g);
    }

...最初にカスタムペイントを実行し、次にコンポーネントをその上に配置するだけだと考えています。ただし、そのようにすると、カスタムペイントは完全に消え、ボタンだけが表示されます。つまり、黒い長方形ではなく、ボタンと白い(デフォルト)背景のみです。

何か案は?

ありがとう!

編集:黒い長方形が例であることを明確にしたい。背景色を簡単に設定できることは承知していますが、最終的には自分の好きなカスタムペイントができるようにしようとしています。

4

2 に答える 2

9

paintComponent()オーバーライドしたくないと思いますpaint()

paint()通常、ペイントは行いませんが、、、およびに委任paintComponent()paintBorder()ますpaintChildren()

詳細については、を参照javax.swing.JComponent.paint()してください

例:

  @Override
  public void paintComponent(Graphics g) {
    /* your draw code here */
  }

super.paintComponent(g);を呼び出すことができます。通常どおりコンポーネントを描画しますが、省略できます。

于 2012-06-18T01:25:40.510 に答える
6

パネルの背景を黒に設定し、UIデリゲートの色を調整できます。setBorderPainted(false)必要に応じてボタンを強調表示できます。必要に応じて質問を更新するためのsscceを次に示します。これは、コンポーネントの「背後」にあるパネルを更新するAnimationTest方法を示しています。paintComponent()

補遺:super.paintComponent(g)最初に置くと、コンポーネントが(おそらく変化する)背景の上に重なるように見えます。コンポーネントの背景色はUIデリゲートの制御下にあるため、次のいずれかを実行できます。

  • 以下に示すように、を使用しUIManagerて対応するプロパティを変更します。
  • ここに示すように、JButtonをオーバーライドするカスタムを使用します。paintComponent()
  • ここに示すように、カスタムUIデリゲートを使用します。

SSCCE:

import component.Laf;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

/** @see https://stackoverflow.com/a/11075785/230513 */
public class ButtonPanel extends JPanel {

    public ButtonPanel() {
        this.setBackground(Color.black);
        final JButton b = new JButton(new AbstractAction("Button"){

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Clicked");
            }
        });
        // b.setBorderPainted(false);
        this.add(b);
    }

    private void display() {
        UIManager.put("Button.foreground", Color.white);
        UIManager.put("Button.background", Color.black);
        JFrame f = new JFrame("ButtonPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonPanel().display();
            }
        });
    }
}
于 2012-06-18T00:10:30.097 に答える