2

私は2つ持っていJPanelます。最初のものには s が含まれており、2 番目のものは単にMouseJButtonで描画できます。問題は、 をクリックして描画を開始し、 にも描画するときです。私が見ていない場所について、何らかの方向性を教えてください。JButtonJButtonJPanel


メインクラス

public class LabelDemo extends JFrame {

    JPanel p1 = new JPanel();
    painter p2 = new painter();
    JButton red = new JButton("red");
    JButton blue = new JButton(" blue ");
    JLabel lbl = new JLabel("Label");
    ImageIcon icon = new ImageIcon("image/YouTube.png");

    public LabelDemo() {

        setLayout(new BorderLayout());
        p1.setBorder(new LineBorder(Color.gray));
        //jbt1.setIcon(icon);

        p1.add(red);
        p1.add(blue);
        lbl.setOpaque(true);
        lbl.setBackground(Color.yellow);
        p1.add(lbl);
        p1.setBounds(20, 30, 40, 78);
        add(p1,BorderLayout.EAST);
        add(p2,BorderLayout.CENTER);
    }

    public static void main(String[] args){

        LabelDemo frame = new LabelDemo();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(700, 400);
        frame.setLocationRelativeTo(null);              
    }
}

インクラス

class painter extends JPanel  {

    int x , y;
    boolean isPresed = false;

    public void setPainter(int x , int y) {    
        this.x = x;
        this.y = y;
    }

    public painter() {

        addMouseMotionListener(new MouseMotionAdapter() {                   
            public void mouseDragged(MouseEvent e) {
                isPresed = true;
                setPainter(e.getX(),e.getY());
                repaint(); 
            }   
        });
    }

    protected void paintComponent(Graphics g){
        Color randomColor = Color.getHSBColor( (float)Math.random(), 1.0F, 1.0F );
        if(isPresed){                       
            g.setColor(randomColor);
            g.fillOval(x-5, y-5, 10, 10);
        }
    }
}//end of painter

ここに画像の説明を入力

4

2 に答える 2

0

painterペインのメソッドでは、最初paintComponentに呼び出す必要があります。super.paintComponent

Swing は を再利用するGraphicsため、バッファ内に古いコンテンツが残っている可能性があります。を呼び出すとsuper.paintComponent、これでクリーンアップされます

protected void paintComponent(Graphics g){
    // Must call super.paintComponent() so the Graphics is updated correctly...
    super.paintComponent();
    Color randomColor = Color.getHSBColor( (float)Math.random(), 1.0F, 1.0F );
    if(isPresed){                       
        g.setColor(randomColor);
        g.fillOval(x-5, y-5, 10, 10);
    }
}
于 2012-08-18T21:23:15.903 に答える
0

OK、私が理解したように、赤または青のボタンをクリックすると、東のパネル (p1 パネル) を取り除きたい:

package stack;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.*;
import javax.swing.border.LineBorder;

public class LabelDemo extends JFrame {
    JPanel p1 = new JPanel();
    Painter p2 = new Painter();
    JButton red = new JButton("red");
    JButton blue = new JButton(" blue ");
    JLabel lbl = new JLabel("Label");
    ImageIcon icon = new ImageIcon("image/YouTube.png");
    public LabelDemo() {
        setLayout(new BorderLayout());
        p1.setBorder(new LineBorder(Color.gray));
//      jbt1.setIcon(icon);
        p2.setPreferredSize(new Dimension(600,400));
        p1.add(red);
        p1.add(blue);
        lbl.setOpaque(true);
        lbl.setBackground(Color.yellow);
        p1.add(lbl);
        p1.setBounds(20, 30, 40, 78);
        add(p1,BorderLayout.EAST);
        add(p2,BorderLayout.CENTER);
        red.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e){
            remove(p1);
            repaint();
            revalidate();
        }
    });
    blue.addActionListener(new ActionListener(){

        public void actionPerformed(ActionEvent e){
            remove(p1);
            repaint();
            revalidate();
        }
    });
}


    public static void main(String[] args){
       LabelDemo frame = new LabelDemo();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.pack();   
       frame.setVisible(true);
    }
}
class Painter extends JPanel  {
    int x , y;
    boolean isPresed = false;
     public void setPainter(int x , int y) {
    this.x = x;
    this.y = y;
}
     public Painter() {

    addMouseMotionListener(new MouseMotionAdapter() {

        public void mouseDragged(MouseEvent e) {
            isPresed = true;
            setPainter(e.getX(),e.getY());
            repaint(); 
        }   
    });
}

    protected void paintComponent(Graphics g){
        Color randomColor = Color.getHSBColor( (float)Math.random(), 1.0F, 1.0F );
    if(isPresed){   

        g.setColor(randomColor);
        g.fillOval(x-5, y-5, 10, 10);
    }
    }
}//end of painter

また、setSize() メソッドの呼び出し pack() および setPreferredSize() を呼び出さないでください。そのため、私は個人的に数回批判されました。ただの注釈。

于 2012-08-18T16:15:49.787 に答える