-1

これは前回と同じ質問ですが(ここを参照)、すべてを正しく機能させるのにまだ問題があります。現在表示する実際のGUIがありますが、ボタンやペイントしたコンテンツなどは何も表示されません。誰か助けていただければ幸いです!! ありがとうございました!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Paint{

 public static void main(String[] args){
    Win frame = new Win();
    frame.setSize(500, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

 }

}

class gui extends JComponent{
 Image image;
 Graphics2D draw;
 int x, y, prevX, prevY;

gui(){
        setDoubleBuffered(false);   
        addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent e){
                        prevX = e.getX();
                        prevY = e.getY();
                }

        });

        addMouseMotionListener(new MouseMotionAdapter(){
                public void mouseDragged(MouseEvent e){
                        x = e.getX();
                        y = e.getY();
                        draw.drawLine(prevX, prevY, x, y);
                        repaint();
                        prevX = x;
                        prevY = y;

                }


        });

}


public void changeColor(Color color)
{
    draw.setPaint(color);
    repaint();
}
public void clear(){
    draw.setPaint(Color.white);
    draw.fillRect(0, 0, getSize().width, getSize().height);
    draw.setPaint(Color.black);
    repaint();
}
public void paintComponent(Graphics g)
{
    if(image == null)
    {
        image = createImage(getSize().width, getSize().height);
        draw = (Graphics2D)image.getGraphics();
        draw.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        clear();
    }

    g.drawImage(image, 0, 0, null);
 }
} 





class Win extends JFrame implements ActionListener{
    JButton red, green, blue, clear;
    gui gui = new gui();

    Win(){
        super("Paint");
        setSize(500,500);


        Container content=new Container();
        content.setLayout(new BorderLayout());
        content.add(gui, BorderLayout.CENTER);
        content.setVisible(true);

        JPanel panel = new JPanel();
        content.add(panel, BorderLayout.SOUTH);

        panel.setPreferredSize(new Dimension(32, 68));
        panel.setMinimumSize(new Dimension(32, 68));
        panel.setMaximumSize(new Dimension(32, 68));


        red = new JButton("Red");
        green = new JButton("Green");
        blue = new JButton("Blue");
        clear = new JButton("Clear");

        red.setPreferredSize(new Dimension(50, 16));
        green.setPreferredSize(new Dimension(50,16));
        blue.setPreferredSize(new Dimension(50, 16));

        panel.add(red);
        panel.add(green);
        panel.add(blue);
        panel.add(clear);

        panel.setVisible(true);

        red.addActionListener(this);
        green.addActionListener(this);
        blue.addActionListener(this);
        clear.addActionListener(this);




    }
    public void actionPerformed(ActionEvent e) {

        if( e.getSource()==red){
            gui.changeColor(Color.red);
            repaint();
        }
        if( e.getSource()==green){
            gui.changeColor(Color.green);
            repaint();
        }
        if( e.getSource()==blue){
            gui.changeColor(Color.blue);
            repaint();
        }
        if( e.getSource()==clear){
            gui.clear();
        }


    }
}
4

2 に答える 2

2

そのWinコンストラクターを見てください。多くのコンポーネントを作成し、それらを多くのパネルに追加しますが、実際にはそれらのどれもWinインスタンスに追加されません。

表示するのはそのWinインスタンスなので、何も表示されないのは理にかなっています

その他の注意事項:

  • ここにすべてのコードをダンプするのではなく、SSCCEに切り詰めてみてください(短いことに重点を置いて)。たとえば、1つのボタンだけで問題を再現できるのに、なぜ5つのボタンのコードを表示するのか。ActionListener問題がUIが表示されない場合のコードが表示される理由
  • を呼び出す必要はありませんset(xxx)SizeJFrame#packすべてのコンポーネントを追加した後に使用します
  • コンポーネントはデフォルトで表示されます。setVisible( true )したがって、すでに表示されている親にコンポーネントを追加する限り、作成する各コンポーネントを呼び出す必要はありません。
  • クラスでのGraphics2Dフィールドの使用は完全に間違っています。カスタムペイントguiのメソッドをオーバーライドする必要がありますpaintComponent
  • クラスの名前はgui、Javaの命名規則に違反しています。これにより、コードが読みにくくなります
于 2012-11-13T16:42:58.650 に答える
1

GUIクラスを使用していないようです-次の行を追加します:

frame.add(new Gui());

フレームを表示するように設定した後(標準ではないクラスのGUIに名前を付けていることに注意してください)

于 2012-11-13T16:48:48.293 に答える