2

画像を保持している JLabel をクリックすると、JLabel に円が表示されるプログラムを作成しています。これは私の macintosh/java6 では問題なく動作しますが、windows/java7 を使用していると、あらゆる種類の奇妙なことが起こります。画像の一部に円を描くことができません。写真の真ん中にある見えない四角のようなものです。また、サークルが消えて別のタイミングで戻ってくることもあります。新しい円を描くたびに、すべての円がラベルの上に再描画されます。

public void paint(JComponent label) {
    Graphics g = label.getGraphics();
    for (T node : nodes.keySet()) {
        Point p = nodes.get(node);
        Color color;
        if (p.selected) {
            color = Color.RED;
        } else {
            color = Color.BLUE;
        }
        g.setColor(color);
        g.fillOval(p.x, p.y, circleRadius*2, circleRadius*2);
        g.setColor(Color.BLACK);
        g.setFont(new Font("Helvetica", 20, 20));
        g.drawString((String) node, p.x, p.y);
    }       
}

誰がこれを引き起こす可能性があるか知っていますか?

4

2 に答える 2

5

getGraphics() を使用しないでください。null を返すことができ、せいぜい最後のペイント サイクルのスナップ ショットです。

再描画が発生するとすぐに、それに描画されたものはすべて削除されます

代わりに、Legend が既に示唆しているように、カスタム ラベルを作成し、paintComponent をオーバーライドして、ここでペイントを実行します。

ペイントはステートレスであることを忘れないでください。つまり、再ペイントするたびに、状態を再構築する必要があります。

カスタムペイントを見てみる

于 2013-03-16T22:50:17.567 に答える
0

ペイントを削除します(JComponent j); メソッドを使用して、次の JLabel を使用してみてください。必要に応じて微調整してください。

final JLabel jLabel = new JLabel("!X!") {
    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        for (T node : nodes.keySet()) {
            Point p = nodes.get(node);
            Color color;
            if (p.selected) {
                color = Color.RED;
            } else {
                color = Color.BLUE;
            }
            g.setColor(color);
            g.fillOval(p.x, p.y, circleRadius*2, circleRadius*2);
            g.setColor(Color.BLACK);
            g.setFont(new Font("Helvetica", 20, 20));
            g.drawString((String) node, p.x, p.y);
        }              
    }
};
于 2013-03-16T22:53:52.323 に答える