我似乎无法在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);
}
}
答案 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)
。