-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(强调简短)。例如,如果您只需一个按钮即可重现您的问题,为什么要向我们展示 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 回答