JFrame没有显示任何内容

时间:2016-08-28 22:07:44

标签: java swing

我似乎无法在JFrame中显示一个矩形。根据这个项目的参数,我必须让这个类实现Icon接口。当我按原样运行代码时,我得到了JFrame,但内部没有任何内容。它应该显示一个黑色方块。我假设问题与我如何初始化图形实例变量有关。我没有多少使用GUI图形的经验,所以我并不完全清楚如何正确地做到这一点。

是的,我知道getIconWidth和getIconHeight方法是多余的,因为我使用常量,但我必须有这些方法才能实现接口。

public class MugDisplay extends JFrame implements Icon {
private int width;
private int height;
private JPanel panel;
private Graphics graphics;

private static final int ICON_WIDTH = 100;
private static final int ICON_HEIGHT = 100;


public MugDisplay() {
    this.configureGui();
    this.panel = new JPanel();
    this.panel.setLayout(new BorderLayout());
    this.add(this.panel, BorderLayout.CENTER);
    this.graphics = this.getGraphics();
    int xPos = (this.panel.getWidth() - this.getIconWidth()) / 2;
    int yPos = (this.panel.getHeight() - this.getIconHeight()) / 2;
    this.paintIcon(this.panel, this.graphics, xPos, yPos);
}


@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.BLACK);
    g2.fillRect(x, y, ICON_WIDTH, ICON_HEIGHT);
}


@Override
public int getIconWidth() {
    return ICON_WIDTH;
}


@Override
public int getIconHeight() {
    return ICON_HEIGHT;
}

private void configureGui() {
    this.setPreferredSize(new Dimension(600, 600));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().setLayout(new BorderLayout());
    this.pack();
    this.setVisible(true);
}

}

为了拥有MCVE,这里是调用此类的驱动程序类。

 public class Main {

public static void main(String[] args) {
    MugDisplay md = new MugDisplay();
    md.setVisible(true);
}

}

1 个答案:

答案 0 :(得分:3)

this.graphics = this.getGraphics()不是自定义绘画在Swing中的工作原理。您应该做的是创建一个面板,覆盖其paintComponent方法,拨打super,然后然后进行绘画。例如:

panel = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        int xPos = ...
        paintIcon(this, g, xPos, yPos);
    }
}

调用getGraphics将为您提供一个短暂的Graphics对象,该对象很快就会变为无效,这就是为什么您应该选择覆盖paintComponent代替,这总是会给您一个可用的Graphics对象。请参阅Performing Custom Painting

另外,在您完成向JFrame添加必要组件之前,您似乎正在调用setVisible(true)。为确保您的组件显示,请在将所有组件全部添加到框架后调用setVisible(true)